【发布时间】: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()等)
标签: laravel eloquent relationship eager-loading