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 中与分类学的多对多关系的主要内容,如果未能解决你的问题,请参考以下文章