【问题标题】:3 models relationship in Laravel 5Laravel 5 中的 3 种模型关系
【发布时间】:2019-07-26 00:38:50
【问题描述】:

我有 3 个模型。

  • 项目 {id, name}
  • 平台 {id, name}
  • 版本 {id, value}

一个项目可以有多个平台,每个平台可以有多个版本在一个项目中。我有下表与模型相关:

如您所见,Project 6 在平台 1 上具有版本 1 和 3,而 Project 8 在同一平台上具有版本 1 和 2。

我想根据项目获取所有项目的平台和这些平台的版本。

例如,我想做

App\Project::find(6)->platform()->with('version')->get();

并在我的这个项目平台 1 的版本集合中仅获取 id 为 1 和 3 的版本。

这就是我在项目模型中的内容:

public function platform()
{
    return $this->belongsToMany('App\Platform')->withPivot('version_id')->distinct();
}

这就是我在平台模型中所拥有的:

public function version()
{
    return $this->belongsToMany('App\Version', 'platform_project')->distinct();
}

您能帮我找出达到预期结果的最佳方法吗?

【问题讨论】:

    标签: php laravel laravel-5 eloquent relationship


    【解决方案1】:

    在这种情况下,您应该使用hasManyThrough 关系。

    定义:

    “has-many-through”关系为通过中间关系访问远距离关系提供了便捷的捷径。例如,一个 Country 模型可能通过一个中间 User 模型有许多 Post 模型。在此示例中,您可以轻松收集给定国家/地区的所有博客文章。

    试试这个:

    项目模型

     public function versions()
        {
            return $this->hasManyThrough(
                'App\Version',
                'App\Platform',
            );
        }
    

    传递给 hasManyThrough 方法的第一个参数是我们希望访问的最终模型的名称,而第二个参数是中间模型的名称。

    执行关系查询时将使用典型的 Eloquent 外键约定。如果您想自定义关系的键,可以将它们作为第三个和第四个参数传递给 hasManyThrough 方法。第三个参数是中间模型的外键名称。第四个参数是最终模型的外键名称。第五个参数是本地键,而第六个参数是中间模型的本地键:

    所以你可以像这样访问所有项目版本:

    $projectVersions = Project::find($id)->versions();
    
    foreach($projectVersions as $version)
    {
      echo $version->value; // this will echo each version value from the given project
    }
    

    另外,我认为您应该将您的关系更改为hasMany

    项目模型

    public function platforms()
    {
        return $this->hasMany('App\Platform')->distinct();
    }
    

    平台模型

    
    public function versions()
    {
        return $this->hasMany('App\Version')->distinct();
    }
    
    public function project()
    {
        return $this->belongsTo('App\Project');
    }
    

    版本模型

    public function platform()
    {
        return $this->belongsTo('App\Platform');
    }
    

    【讨论】:

      【解决方案2】:

      试试这个:

      App\Project::find(6)->with(['platform' => function($q){
           $q->with(['version']);
      }])->get();
      

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 2016-02-06
        • 2021-05-13
        • 2019-05-07
        • 2020-03-07
        • 1970-01-01
        • 2018-12-07
        • 2015-05-27
        • 1970-01-01
        • 2018-02-19
        相关资源
        最近更新 更多