Eloquent 中与分类学的多对多关系

Posted

技术标签:

【中文标题】Eloquent 中与分类学的多对多关系【英文标题】:Many to many relationships with taxonomy in Eloquent 【发布时间】:2013-04-10 12:09:45 【问题描述】:

我正在使用 Laravel 4。我的系统中有许多关系。我选择使用 Wordpress 分类表方案。

但是如何使用 Laravel 4 Eloquent ORM 建立模型关系?这是我的数据库表;

terms:

+------------+---------------------+------+-----+---------+----------------+
| Field      | Type                | Null | Key | Default | Extra          |
+------------+---------------------+------+-----+---------+----------------+
| term_id    | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| name       | varchar(200)        | NO   | MUL |         |                |
| slug       | varchar(200)        | NO   | UNI |         |                |
+------------+---------------------+------+-----+---------+----------------+

term_taxonomy:

+------------------+---------------------+------+-----+---------+----------------+
| Field            | Type                | Null | Key | Default | Extra          |
+------------------+---------------------+------+-----+---------+----------------+
| term_taxonomy_id | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| term_id          | bigint(20) unsigned | NO   | MUL | 0       |                |
| taxonomy         | varchar(32)         | NO   | MUL |         |                |
| description      | longtext            | NO   |     | NULL    |                |
| parent           | bigint(20) unsigned | NO   |     | 0       |                |
| count            | bigint(20)          | NO   |     | 0       |                |
+------------------+---------------------+------+-----+---------+----------------+

term_relationships:

+------------------+---------------------+------+-----+---------+-------+
| Field            | Type                | Null | Key | Default | Extra |
+------------------+---------------------+------+-----+---------+-------+
| object_id        | bigint(20) unsigned | NO   | PRI | 0       |       |
| term_taxonomy_id | bigint(20) unsigned | NO   | PRI | 0       |       |
| term_order       | int(11)             | NO   |     | 0       |       |
+------------------+---------------------+------+-----+---------+-------+

通常我们可以做return $this->belongsToMany('Term');,但是我们怎么做2个关系呢?我们需要 2 个关系,首先从“term_taxonomy”表中找到术语分类,然后找到与“taxonomy_id”的术语关系。

还有一个我想如何使用的例子;

$categories = Post::find(1)->categories; // get terms with taxonomy="post_category" 
$tags = Post::find(1)->tags; // get terms with taxonomy="post_tag" 

我不想用基本数据库类“DB::table('table')->join('...')...”来做这件事,我想使用 Eloquent 关系方法和模型。

【问题讨论】:

【参考方案1】:

您可以创建 getter 方法来处理这些:

在您的 Post 模型中,按照以下方式创建新方法:

public function getCategories()

    return $this->hasMany()->where('taxonomy', 'post_category');


public function getTags()

    return $this->hasMany()->where('taxonomy', 'post_tag');

【讨论】:

以上是关于Eloquent 中与分类学的多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel eloquent 检查不存在的多对多关系

与多个中间表的多对多 Laravel Eloquent 关系

数据库优先方法中与联结表的多对多关系

从 Laravel 中的多对多关系获取列值

这是在fuelphp中与额外字段创建多对多关系的正确方法吗

如何从雄辩关系中的第三个表中获取数据雄辩的多对多关系