我有一个按以下方式设置的资源
表:
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
关系仅检索特定类型的链接资源?
最佳答案
怎么样
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();
关于laravel-4 - Laravel 4 如何与同一张表建立多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24252326/