Laravel 4如何与同一个表建立多对多关系

时间:2014-06-16 21:14:59

标签: laravel-4 many-to-many

我按以下方式设置了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关系仅检索特定类型的链接资源?

1 个答案:

答案 0 :(得分:4)

怎么样?
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();