如何在 Laravel Eloquent 中构建具有多级关系的查询
Posted
技术标签:
【中文标题】如何在 Laravel Eloquent 中构建具有多级关系的查询【英文标题】:How to build query with multi level relations in Laravel Eloquent 【发布时间】:2021-12-28 19:07:17 【问题描述】:我有三个模型。 Sponsor
、Optin
和 Participant
。 Sponsor
与 Optin
具有一对多关系,Optin
与 Participant
具有一对一关系。
这使模型看起来像这样:
赞助模式
class Sponsor extends Model
public function optins()
return $this->hasMany(Optin::class);
光学模型
class Optin extends Model
public function sponsor()
return $this->belongsTo(Sponsor::class);
public function participant()
return $this->belongsTo(Participant::class);
参与者模型
class Participant extends Model
public function optins()
return $this->hasMany(Optin::class);
public function scopeCreatedToday($query)
return $query->whereDate('created_at', Carbon::today());
现在,在每日计划任务中,我想遍历所有参与者,这些参与者是今天创建的,并且选择了某个赞助商来像电子邮件或其他东西一样向他们发送。现在,我尽可能地回应了所属参与者的身份。但下一步是获取参与者对象并按正确的创建日期过滤它们。但我对如何处理这个问题有点迷茫。
$sponsor = Sponsor::find(1);
$count = $sponsor->optins()->count();
echo("Count: " . $count . "\n");
$optins = $sponsor->optins()->get();
foreach($optins as $optin)
echo($optin->participant_id . "\n");
编辑:
在重新考虑结构后,我发现Optin
与Participant
具有多对一的关系。
【问题讨论】:
您的optins
表是否有sponsor_id
和participant_id
列?
是的。我已经在其他情况下使用了这些关系。
【参考方案1】:
由于Participant
与Optin
具有一对多关系,我在Sponsor
模型上添加了以下关系。将Optin
模型作为第二个参数传递给belongsToMany
方法,因为它充当中间表。
public function participants()
return $this->belongsToMany(Participant::class, Optin::class);
从那里我可以通过添加属于赞助商的子查询轻松获得所有参与者,如下所示:
$sponsor = Sponsor::find(1);
$participants = $sponsor->participants()->createdToday()->get();
foreach($participants as $participant)
//do something with $participant
【讨论】:
与其重新散列我的答案,不如对它进行相应的投票。 @miken32 重新散列?首先..您的答案(即使在 3 次更新后)仍然给出错误.. 其次.. 对于您的答案部分确实有效.. 我参考了您的答案..以上是关于如何在 Laravel Eloquent 中构建具有多级关系的查询的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用Eloquent ORM时构建Laravel应用程序
如何在 Laravel 4 中手动创建一个新的空 Eloquent 集合
如何在 Eloquent 模型中使用 Laravel Livewire?