laravel-4 - Laravel 4 如何与同一张表建立多对多关系

标签 laravel-4 many-to-many

我有一个按以下方式设置的资源表:

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/

相关文章:

php - Laravel/Angular : passing data within php page to angularjs

php - PHP 中的 Laravel header 和缓存

php - 拉维尔 4 : How to display a message without redirecting?

java - Grails:GORM:遍历多对多关系

php - Laravel 4 - 渲染递归@include

php - 自引用模型导致 Laravel 4 中 x 的最大函数嵌套级别

mysql - 用户有很多台计算机,计算机在不同的表中有很多属性,最好的加入方式是什么?

ios - Swift Core Data 多对多关系处理,代码生成为手动/无

c# - Linq to Sql - 多对多 - CRUD

php - 关联表是否需要 Yii 框架中的模型?