Reputation: 3695
I am developing a p2p app with laravel. I have two tables namely users and loans.
Firstly, a user can be a lender or borrower.
Then users can have multiple loans and multiple loans belong to multiple users.
Also, a loan can belong to one borrower and also to multiple lenders.
To explain it further, the loan record will be created by the borrower(or the user). Then the system will distribute the loan and assign it to multiple lenders.
Example: Let's say, one borrower wants a loan of 3000. Our system will distribute the loan as 2000 and 1000 (or 1500 and 1500, or 2500 and 500, etc.). Then assign it to two lenders.
Now it could be more lenders or bigger amounts.
So how can I define something like this with laravel eloquent?
Here's what I thought of till now.
Users and loans will have a many-to-many relationship.
Loans table will have a lender_data column which will be an array that contains lender_id and amount.
But I can't really figure out a way to fetch all the loans of a single lender. So how can I do that?
That's a lot of words. Thank you for reading.
Upvotes: 1
Views: 79
Reputation: 7111
I'd go with next:
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']);
}
}
In loan_user pivot table you should make field called percentage
that will go to user from full amount. In second pivot between LoanUser and Lander lander_loan_user
you should also need percentage
field that you would assign to each lander_loan_user relation. It would be second pivot table data.
After you save loan_user data, you would need to attach landers to first pivot model (second pivot table doesn't require pivot model per description). Since there are eager loaded landers to pivot model, when you query some user and their loan
$user = User::where(['loan.amount' => 3000])->first();
$user->pivot->landers;// will get you related landers
You already have full amount in first pivot table and with percentage from same table you know how much user (borrower) gets and in pivot's relation to landers table you will know how much each lander gets from that loan.
It is like "T" relation where upper ends of 't' letter are Loan and User, that crossroad is LoanUser pivot and lower end (base) of the letter 't' are landers.
To avoid hard time as much as possible, keep up with eloquent's convention (check good practice here) and for example, instead of borrower_id
call that loan_id
, also pivot table to be loan_user
(pay attention on pivot singular).
This was written from top of head and not tested but this is the idea/way how task can/should be finished.
Upvotes: 1
Reputation: 9329
First of all, this question is quite vague and doesn't show any code which I think all questions should. Its harder to answer questions like this that don't necessarily have predefined answers.
Personally, I'd look into intermediate table models:
https://laravel.com/docs/8.x/eloquent-relationships#defining-custom-intermediate-table-models
That way you can have a Lenders
table, a Loan
table, a Users
table, and this "in between" table that could be something like a LoanAmount
table. The LoanAmount table is mostly a pivot table (allowing the many to many relationship between Lenders and Loans), however it can also store data like:
loan_id lender_id amount
1 1 1000
1 2 1000
Then the loan table would just be
user_id amount
1 2000
So a User
can have many Loans
, but it's the Loans
that can have many LoanAmounts
.
Upvotes: 1