如何定义以下关系

How to define the following relationship

我正在使用 laravel 开发一个 p2p 应用程序。我有两个 table,即用户和贷款。

首先,用户可以是贷款人或借款人。

那么用户可以有多笔贷款,多笔贷款属于多个用户。

此外,一笔贷款可以属于一个借款人,也可以属于多个贷方。

进一步说明,贷款记录将由借款人(或用户)创建。然后系统会将贷款分配给多个贷款人。

示例:假设一位借款人想要一笔 3000 的贷款。我们的系统会将贷款分配为 2000 和 1000(或 1500 和 1500,或 2500 和 500,等等)。然后将其分配给两个贷方。

现在可能是更多的贷方或更大的数额。

那么我怎样才能用 laravel eloquent 定义这样的东西呢?

这是我目前想到的。

  1. 用户和贷款之间是多对多的关系。

  2. 贷款 table 将有一个 lender_data 列,它将是一个包含 lender_id 和金额的数组。

但我真的想不出一种方法来提取单个贷方的所有贷款。那我该怎么做呢?

这是很多话。感谢阅读。

首先,这个问题很模糊,没有显示任何我认为所有问题都应该的代码。很难回答这样不一定有预定义答案的问题。

就个人而言,我会研究中间 table 模型:

https://laravel.com/docs/8.x/eloquent-relationships#defining-custom-intermediate-table-models

这样你就可以有一个 Lenders table,一个 Loan table,一个 Users table,这个“在between" table 可能类似于 LoanAmount table。 LoanAmount table 主要是一个枢轴 table (允许贷款人和贷款之间的多对多关系),但是它也可以存储数据,如:

loan_id   lender_id   amount
1         1           1000
1         2           1000

那么贷款 table 就是

user_id   amount
1         2000

所以一个User可以有很多Loans,但是Loans可以有很多LoanAmounts

我会选择下一个:

class User extends Model
{
    public function loans()
    {
        return $this->belongsToMany(Loan::class)->using(LoanUser::class)->withPivot(['amount', 'percentage']);
    }
}

class Loan extends Model
{
    public function users()
    {
        return $this->belongsToMany(User::class)->using(LoanUser::class)->withPivot(['amount', 'percentage']);
    }
}

class LoanUser extends Pivot
{

    protected $with = [
        'landers',
    ];

    public function landers()
    {
        return $this->belongsToMany(Lander::class)->withPivot(['percentage']);
    }
}

class Lander extends Model
{
    public function loanUsers()
    {
        return $this->belongsToMany(LoanUser::class)->withPivot(['percentage']);
    }
}

在 loan_user 数据透视表 table 中,您应该创建名为 percentage 的字段,该字段将从全部金额转到用户。在 LoanUser 和 Lander lander_loan_user 之间的第二个枢轴中,您还应该需要 percentage 字段,您将分配给每个 lander_loan_user 关系。这将是第二个枢轴 table 数据。 保存 loan_user 数据后,您需要将着陆器附加到第一个枢轴模型(第二个枢轴 table 根据描述不需要枢轴模型)。因为有急切加载的着陆器来转换模型,当你查询一些用户和他们的贷款时

$user = User::where(['loan.amount' => 3000])->first();
$user->pivot->landers;// will get you related landers

您已经在第一个数据透视表 table 中获得了全部金额,并且根据相同的百分比 table 您知道有多少用户(借款人)获得了多少,并且在数据透视表与着陆器的关系中 table 您将知道每个着陆器从这笔贷款中得到多少。

就像“T”关系,'t'字母的上端是Loan和User,十字路口是LoanUser pivot,字母't'的下端(base)是landers。

为了尽可能避免困难,请遵守 eloquent 的惯例(检查良好实践 here),例如,而不是 borrower_id 调用 loan_id,也枢轴 table 为 loan_user(注意枢轴单数)。

这是从头开始写的,未经测试,但这是 idea/way 如何完成任务 can/should。