如何在 Laravel Eloquent 中构建具有多级关系的查询
How to build query with multi level relations in Laravel Eloquent
我有三个模型。 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());
}
}
现在,在每天的计划任务中,我想遍历今天创建的所有参与者,并选择加入某个赞助商以像电子邮件之类的方式向他们发送信息。现在,我就回应了所属参与者的 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");
}
编辑:
在重新考虑结构后,我发现 Optin
与 Participant
.
具有多对一关系
由于 Participant
与 Optin
具有一对多关系,因此我在 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');
}
}
我有三个模型。 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());
}
}
现在,在每天的计划任务中,我想遍历今天创建的所有参与者,并选择加入某个赞助商以像电子邮件之类的方式向他们发送信息。现在,我就回应了所属参与者的 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");
}
编辑:
在重新考虑结构后,我发现 Optin
与 Participant
.
由于 Participant
与 Optin
具有一对多关系,因此我在 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');
}
}