我试图在Laravel中创建一个网站,该网站在多对多关系中为多个实体使用单个类别表。我尝试过多态,但它只能以一种方式工作,我需要能够查询以下内容:
这是下面的数据库结构。如您所见,类别中有一个类型列,允许我选择服务或文章作为类别类型。
我的总体想法运作得很好,但我需要确保应用程序不允许意外混合类别类别。我的印象是以下代码会这样做:
class Category extends Model
{
public function services()
{
return $this->belongsToMany('App\Service')->where('type', '=', 'service')->withTimestamps();
}
public function articles()
{
return $this->belongsToMany('App\Article')->where('type', '=', 'article')->withTimestamps();
}
}
class Service extends Model
{
public function categories()
{
return $this->belongsToMany('App\Category')->where('type', '=', 'service')->withTimestamps();
}
}
class Article extends Model
{
public function categories()
{
return $this->belongsToMany('App\Category')->where('type', '=', 'article')->withTimestamps();
}
}
正如我在文档中所读到的那样,在where
之后添加belogsToMany
会限制它。它没有。
我插入以下数据:
id name type created_at updated_at
1 Category One service 2016-01-31 13:23:29 2016-01-31 13:23:29
2 Category Two article 2016-01-31 13:24:02 2016-01-31 13:24:02
id name created_at updated_at
1 Service One 2016-01-31 13:23:10 2016-01-31 13:23:10
然后运行此查询:
$category = App\Category::find(2);
$category->services()->attach(1);
它完美无缺,尽管事实上它正在将服务附加到类型'文章的类别中。它不应该插入这些数据。
如何让限制正常工作?