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