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

How to build query with multi level relations in Laravel Eloquent

我有三个模型。 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());
    } 
}

现在,在每天的计划任务中,我想遍历今天创建的所有参与者,并选择加入某个赞助商以像电子邮件之类的方式向他们发送信息。现在,我就回应了所属参与者的 ID。但下一步是获取参与者对象并按正确的创建日期过滤它们。但是我对如何处理这个问题有点迷茫。

$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.

具有多对一关系

由于 ParticipantOptin 具有一对多关系,因此我在 Sponsor 模型上添加了以下关系。将 Optin 模型作为第二个参数传递给 belongsToMany 方法,因为它充当中间 table.

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
}

如果您想要来自同一个 table 的多级数据,此解决方案可帮助您处理 laravel.and 中的许多关系与('point')是函数 name.your 名称将有所不同.

class Master extends Model
{
    public function point() {
        return $this->hasMany(Master::class,'point_id')->with('point');
    }
}