限制按类别类型说明多对多关系

时间:2016-01-31 14:09:39

标签: php mysql laravel eloquent relationship

我试图在Laravel中创建一个网站,该网站在多对多关系中为多个实体使用单个类别表。我尝试过多态,但它只能以一种方式工作,我需要能够查询以下内容:

  • 所有服务类别的列表
  • 所有文章类别的列表
  • 服务/文章所在的所有类别的列表
  • 类别中所有服务/文章的列表

这是下面的数据库结构。如您所见,类别中有一个类型列,允许我选择服务或文章作为类别类型。

schema

我的总体想法运作得很好,但我需要确保应用程序不允许意外混合类别类别。我的印象是以下代码会这样做:

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);

它完美无缺,尽管事实上它正在将服务附加到类型'文章的类别中。它不应该插入这些数据。

如何让限制正常工作?

0 个答案:

没有答案