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: 1environment 和带有 id: 1id: 2 的部署。

【问题讨论】:

$project-&gt;environments()-&gt;first()-&gt;deployments,或$project-&gt;environments()-&gt;latest()-&gt;first()-&gt;deployments。只要您为 Project -> Environments 和 Environment -> Deployments 定义关系,那么您就可以像这样链接它们。 hasManyThrough() 是这种事情的快捷方式。 @TimLewis 这是否也适用于急切加载,就像我的情况一样?我目前有这种奇怪的行为,使用 $this-&gt;environments()-&gt;first()-&gt;deployments() 使用项目 ID 而不是环境 ID 来获取部署。 嗯,不完全是。您必须定义environment 的关系(如下面的答案),然后$project = Project::with(['environment.deployments'])-&gt;first() 将允许您调用$project-&gt;environment-&gt;deployments。此外,您必须执行-&gt;deployments-&gt;deployments()-&gt;get()-&gt;deployments() 是一个 Builder 实例,需要一个 Closure(-&gt;get()-&gt;first()-&gt;paginate() 等) 【参考方案1】:

我认为您可能希望像这样指定 hasOne 关系:

// Project.php
public function environment()

    return $this->hasOne(Environment::class);

然后您可以使用以下方法预先加载部署:

Project::with(['environment.deployments'])

我认为您无法在 Project 上构建 developments() 关系函数,但有人可能会证明我错了。

【讨论】:

以上是关于hasManyThrough() 仅使用第一个“通过”关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel hasManyThrough 等价物:通过另一个模型的 belongsTo 关系

将 hasManyThrough 应用于更深层次的关系

拉拉维尔 |使用 Eloquent hasManyThrough

hasmanythrough 关系不起作用

我想使用 hasManyThrough 关系在类别页面上显示分页

Laravel 5 hasManyThrough 数据透视表