【问题标题】:Laravel 4 how to set up many-to-many relationship with the same tableLaravel 4 如何与同一张表建立多对多关系
【发布时间】:2014-06-20 09:14:21
【问题描述】:

我有一个resources 表以下列方式设置:

resources
  id - integer, pk
  name - string
  description - string
  type_id - integer, fk
  ...

我的目标是在同一张表中的项目之间建立多对多的关系。因此,当用户查看一个资源时,他们还可以查看与其链接的所有其他资源。

我假设我需要设置一个数据透视表,比如...

resource_links
  id - integer, pk
  id_left- integer
  id_right - integer

然后我可以设置一个查询范围以从数据透视表中选择 id_left 或 id_right 等于资源 id 的条目,并从资源表中返回 id_left/right 不等于当前资源 id 的所有行。

什么是做我想做的最好的方法?

更新:
我的资源表还有一列来定义它是什么类型的资源。是否可以使用belongsToMany 关系仅检索特定类型的链接资源?

【问题讨论】:

    标签: laravel-4 many-to-many


    【解决方案1】:

    怎么样

    resources
      id - integer
      name - string
      description - string
    
    resource_links
      id - integer
      resource_id - integer
      linked_resource_id - integer
    

    这让任何查看枢轴的人都更清楚它在做什么。然后,您可以使用类似

    的方式检索给定资源(下面的 $resource_id)的链接资源
    $linked_resources = DB::table('resources')
                    ->join('resource_links', 'resources.id', '=', 'resource_links.linked_resource_id')
                    ->where('resource_links.resource_id', '=', $resource_id)
                    ->get();
    

    编辑:

    或者您可以将模型上的多对多关系添加回自身

    public function linkedResources()
    {
        return $this->belongsToMany('Resource', 'resource_links', 'resource_id', 'linked_resource_id');
    } 
    

    然后用

    返回链接的资源
    Resource::find(1)->linked_resources; 
    

    编辑:

    如果您想通过类型限制链接资源,如下是一种方法

    $linked_resources = Resource::with(array('linkedResources' => function($query) {
            $query->where('type', '=', 'book');
        }))->where('id','=',1)->get();
    

    【讨论】:

    • 虽然多对多关系(带有数据透视表)可能不起作用,但多对多多态关系应该可以工作(允许您通过模型访问关系,只需定义一个morphedByMany 函数)。这就是我设置我的 cmets 的方式 - 允许我将 cmets 与资源以及其他 cmets 相关联(对于对 cme​​ts 的回复),而无需设置两个数据透视表。
    • 实际上,模型上的直接多对多确实有效 - 我只是犯了在关系名称上使用蛇形大小写而不是骆驼大小写的错误 - 已在上面进行了编辑 - 但正如你所注意到的那样 morphedby many 会是另一个选项
    • 啊,好的!我试试看!
    • 我的资源表也有一列来定义它是什么类型的资源。是否可以使用belongsToMany 关系仅检索特定类型的链接资源?
    • 对于以后阅读这篇文章的任何人,我最终都在模型上建立了多对多关系回到自身。然后我遇到了关系是“单向”的问题(参见:stackoverflow.com/questions/17567305/…),我通过在数据透视表中为每个关系添加两个条目来解决这个问题。
    猜你喜欢
    • 2019-10-15
    • 1970-01-01
    • 2019-01-04
    • 2019-07-08
    • 2018-01-11
    • 2015-05-09
    • 2012-08-27
    • 2020-09-09
    • 2013-02-17
    相关资源
    最近更新 更多