Laravel 检索多个关系
Posted
技术标签:
【中文标题】Laravel 检索多个关系【英文标题】:Laravel retrieve multiple relationships 【发布时间】:2022-01-10 13:37:02 【问题描述】:我有一个 laravel 项目,其中 User
可以有许多 Client
类。 Client
可以有很多 Session
和 Session
可以有很多 Assessment
和很多 Plan
。我在Client
上使用hasManyThrough 来获取Assessment
和Plan
。每个Assessment
和Plan
都有一个review_date
时间戳保存到数据库中。
我想做的是获得所有Assessment
和Plan
的任何Client
和他们的review_date
,就像今天一样。理想情况下是这样的:
$events = Auth::user()->reviews()->today();
我不知道该怎么做才能实现 reviews
函数,因为它本质上是结合了 2 个关系。
谁能帮帮我?
User.php
public function clients()
return $this->hasMany(Client::class);
public function assessments()
return $this->hasManyThrough(Assessment::class, Client::class);
public function plans()
return $this->hasManyThrough(Plan::class, Client::class);
public function reviews()
// return all assessments and plans
public function scopeToday(Builder $query)
$query->whereDate('review_date', Carbon::today());
Client.php
public function assessments()
return $this->hasManyThrough(Assessment::class, Session::class);
public function plans()
return $this->hasManyThrough(Plan::class, Session::class);
Session.php
public function assessments()
return $this->hasMany(Assessment::class);
public function plans()
return $this->hasMany(Plan::class);
【问题讨论】:
【参考方案1】:你可以从这两种方法中得到一个集合,所以你可以简单地merge the 2 together。 (请注意,当您必须在循环期间检查对象类型时,这将导致稍后代码难看。)您不能链接范围方法,因为您没有取回关系对象,但您可以将日期传递为而是一个参数,或者如果您永远不需要其他日期,则只需在今天的日期修复它。
public function reviews(Carbon $date)
return $this
->assessments()
->whereDate('review_date', $date)
->get()
->toBase()
->merge(
$this->plans()->whereDate('review_date', $date)->get()->toBase()
)
->sortBy('review_date');
然后这样称呼它:
$date = now();
$events = Auth::user()->reviews($date);
【讨论】:
如果您合并 2 个不同的 eloquent 集合,您可能会丢失记录,因为它构建了一个由模型键作为键的字典,并且两个集合可能具有具有相同 id 的模型merge()
的文档说它是数字键的附加。模型集合不以主键为键。 laravel.com/docs/8.x/collections#method-merge
Eloquent Collections 是从 Collections 扩展而来并覆盖某些方法,例如 merge
,因为它们使用由模型的主键作为键控的字典......它在代码中,Eloquent\Collection@merge
github.com/laravel/framework/blob/8.x/src/Illuminate/Database/… Eloquent\Collection@getDictionary
github.com/laravel/framework/blob/8.x/src/Illuminate/Database/… “获取由主键键入的字典” ...它们的行为与基本集合不同
***.com/questions/51534929/…
嗯,很高兴知道,我已经更新了答案。 Eloquent 集合似乎有些不一致,比如 Model::all()[1]
返回集合中的第二项,不管 ID 是什么,或者 Model::all()->toArray()
返回一个非稀疏数组。以上是关于Laravel 检索多个关系的主要内容,如果未能解决你的问题,请参考以下文章