hasManyThrough() 仅使用第一个“通过”关系
Posted
技术标签:
【中文标题】hasManyThrough() 仅使用第一个“通过”关系【英文标题】:hasManyThrough() use first "through" relationship only 【发布时间】:2021-10-15 01:56:45 【问题描述】:我目前正在努力使用 hasManyThrough() 函数。基本上,我正在尝试加载 n 到 n 关系,但我只想包含第一个“通过”关系。这是一个例子:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Project extends Model
/**
* Get all of the deployments for the project.
*/
public function deployments()
return $this->hasManyThrough(Deployment::class, Environment::class);
project:
id: 1
name: Project1
environment:
id: 1
project_id: 1
name: environment1
id: 2
project_id: 1
name: environment2
deployment:
id: 1
environment_id: 1
commit_hash: xxxx1
id: 2
environment_id: 1
commit_hash: xxx11
id: 3
environment_id: 2
commit_hash: xxxx2
这里的deployments()
函数显然为特定project
的所有environments
返回所有deployments
。我怎样才能只获取projects
条目的第一个(或最后一个)environments
条目的deployments
?在这种情况下,这将是带有 id: 1
的 environment
和带有 id: 1
和 id: 2
的部署。
【问题讨论】:
$project->environments()->first()->deployments
,或$project->environments()->latest()->first()->deployments
。只要您为 Project -> Environments 和 Environment -> Deployments 定义关系,那么您就可以像这样链接它们。 hasManyThrough()
是这种事情的快捷方式。
@TimLewis 这是否也适用于急切加载,就像我的情况一样?我目前有这种奇怪的行为,使用 $this->environments()->first()->deployments()
使用项目 ID 而不是环境 ID 来获取部署。
嗯,不完全是。您必须定义environment
的关系(如下面的答案),然后$project = Project::with(['environment.deployments'])->first()
将允许您调用$project->environment->deployments
。此外,您必须执行->deployments
或->deployments()->get()
。 ->deployments()
是一个 Builder 实例,需要一个 Closure(->get()
、->first()
、->paginate()
等)
【参考方案1】:
我认为您可能希望像这样指定 hasOne 关系:
// Project.php
public function environment()
return $this->hasOne(Environment::class);
然后您可以使用以下方法预先加载部署:
Project::with(['environment.deployments'])
我认为您无法在 Project 上构建 developments()
关系函数,但有人可能会证明我错了。
【讨论】:
以上是关于hasManyThrough() 仅使用第一个“通过”关系的主要内容,如果未能解决你的问题,请参考以下文章
Laravel hasManyThrough 等价物:通过另一个模型的 belongsTo 关系
拉拉维尔 |使用 Eloquent hasManyThrough