使用Laravel添加pivot记录和相关子记录


Add pivot record and related child records using Laravel

我需要帮助添加一个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记录的句柄,所以我没有办法添加相关的记录(指定)。任何能告诉我如何完成第二种方法的人都会得到复选标记。