Eloquent ORM / Laravel - 使用自定义数据透视表结构

Posted

技术标签:

【中文标题】Eloquent ORM / Laravel - 使用自定义数据透视表结构【英文标题】:Eloquent ORM / Laravel - use custom pivot table structure 【发布时间】:2013-07-19 23:06:09 【问题描述】:

我正在尝试使用自定义数据库结构构建 Laravel 应用程序。我有表typesunitscontent 和一个名为relations 的数据透视表。 relations 表的结构是这样的:

---------------------------------------------
| id | relation_type | first_id | second_id |
---------------------------------------------
|  1 |   type_unit   |     1    |    2      |
---------------------------------------------
|  2 | unit_content  |     2    |    3      |
---------------------------------------------

也就是说,前三个表之间是多对多的关系,第四个是所有关系的透视表。如何将 Eloquent 的 BelongsToMany 方法与此数据透视表结构一起使用,即如何仅选择与给定关系相关的数据透视表记录?例如,我将如何只使用 type_unit 关系:

class Type extends Eloquent 

    public function units()
    
        return $this->belongsToMany('Unit', 'relations');
    


但同时忽略unit_content关系?

【问题讨论】:

【参考方案1】:

belongsToMany 将接受第三个和第四个参数。您可以在文档中看到它:http://laravel.com/docs/eloquent#relationships

但文档中没有的内容是,您可以通过链接查询构建器函数(如 whereorderBy 等)来限制您的关系。

所以你的代码应该是这样的:

class Type extends Eloquent 

    public function units()
    
        return $this->belongsToMany('Unit', 'relations', 'first_id', 'second_id')
          ->withPivot(['relation_type'])
          ->where('relations.relation_type', '=', 'type_unit');
    


【讨论】:

很高兴我能帮上忙。 :)

以上是关于Eloquent ORM / Laravel - 使用自定义数据透视表结构的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent ORM--整理(未转)

Laravel Eloquent ORM 似乎很简单

Laravel 插入嵌套的 Eloquent ORM 模型

Laravel Eloquent ORM 复制

Laravel之Eloquent ORM

Laravel Eloquent ORM 事务