我需要帮助添加一个pivot记录和相关的子记录在Laravel。如果可能的话,我想使用ORM。这里的概念是潜在的捐赠者参加筹款活动并进行捐赠,这将由一个或多个指定组成。我的表是这样的(简化):
donor:
id
name
fund_raiser:
id
date
donation:
id
donor_id
fund_raiser_id
monetary_type
designation:
id
donation_id
category
amount
我可以手动插入数据透视记录,如下所示:
// assume both donor and rundraiser records already exist
$donor = Donor::find($donorID);
$fundraiser = FundRaiser::find($fundraiserID);
// create the pivot record
$donation = Donation::create(['donor_id' => $donor->id, 'fundraiser_id' => $fundraiser->id, 'date' => 'somedate']);
// now add a designation
$designation = new Designation(['Category' => 'General', 'Amount' => '100']);
$donation->designations()->save($designation);
或者我可以用更ORM的方式创建pivot记录:
$fundraiser->donors()->save($donor)
但是现在我不知道如何插入指定,因为我不知道刚刚添加的pivot记录的id
您需要关系定义上的withPivot
来获得枢轴id
,然后您可以在关系上下文中访问枢轴模型,从而访问它的id
:
// Donor model
public function fundRaisers()
{
return $this->belongsToMany('FundRaiser', 'donation')->withPivot('monetary_type', 'id');
}
在FundRaiser
模型上,关系的另一部分也是如此。
然后你可以这样做:
// let's grab single donor
$donor = Donor::first();
// then load fund raisers and get one of them
$fundRaiser = $donor->fundRaisers->find($someId);
// now we're in the context of the relation, so we can access pivot model
$donationId = $fundRaiser->pivot->id;
// use it to save designation
$designation = new Designation([ SOME VALUES]);
$designation->donation_id = $donationId;
$designation->save();
现在,为了访问数据透视上相关的Designation
模型,您需要使用hasMany
关系自定义数据透视模型(扩展Pivot
):
use Illuminate'Database'Eloquent'Relations'Pivot;
class DonationPivot extends Pivot {
protected $table = 'donations';
public function designations()
{
return $this->hasMany('Designation');
}
}
现在你可以使用它了:
$fundRaiser->pivot->designations;
注意你不能打电话给我
$designation->donation;
,因为Pivot
需要在构建时传递依赖项,但是您可以这样做,例如:
$donor = Donor::join('donations', 'donors.id', '=', 'donations.donor_id')->where('donations.id', '=', $designation->donation_id')->first();
要获取枢轴id,您可以在当前连接的PDO上使用lastInsertId:
$fundraiser->donors()->save($donor);
$fundraiser->getConnection()->getPdo()->lastInsertId();
我发现我可以手动插入数据透视记录,如下所示:
// assume both donor and rundraiser records already exist
$donor = Donor::find($donorID);
$fundraiser = FundRaiser::find($fundraiserID);
// create the pivot record, plugging in the necessary id values manually
$donation = Donation::create(['donor_id' => $donor->id, 'fundraiser_id' => $fundraiser->id, 'date' => 'somedate']);
// now add a designation
$designation = new Designation(['Category' => 'General', 'Amount' => '100']);
$donation->designations()->save($designation);
我知道还有另一种方法可以创建pivot记录,这是更ORM的风格:
// assume both donor and rundraiser records already exist
$donor = Donor::find($donorID);
$fundraiser = FundRaiser::find($fundraiserID);
// create the pivot record
$fundraiser->donors()->save($donor)
但是这个方法的问题是我没有得到pivot记录的句柄,所以我没有办法添加相关的记录(指定)。任何能告诉我如何完成第二种方法的人都会得到复选标记。