如何在 Laravel Eloquent 中构建具有多级关系的查询

Posted

技术标签:

【中文标题】如何在 Laravel Eloquent 中构建具有多级关系的查询【英文标题】:How to build query with multi level relations in Laravel Eloquent 【发布时间】:2021-12-28 19:07:17 【问题描述】:

我有三个模型。 SponsorOptinParticipantSponsorOptin 具有一对多关系,OptinParticipant 具有一对一关系。

这使模型看起来像这样:

赞助模式

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");

编辑: 在重新考虑结构后,我发现OptinParticipant 具有多对一的关系。

【问题讨论】:

您的optins 表是否有sponsor_idparticipant_id 列? 是的。我已经在其他情况下使用了这些关系。 【参考方案1】:

由于ParticipantOptin 具有一对多关系,我在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?

Laravel Lumen - Eloquent 查询日志

带有 Eloquent 的 Laravel 不会在数据库中保存模型属性

Laravel/Eloquent belongsToMany - Eloquent 构建器实例上不存在属性 [人]