Laravel,多个模型之间的多对多关系

Laravel, many-to-many relationship among multiple models

我有多个具有多对多关系的模型

这是模型

每个新闻栏目可以有多个类别

每个类别可以有多个子类别

每个子类别可以有多个已批准的新闻待定的新闻

我想要 新闻 类别子类别待定/批准新闻

以及诸如

之类的东西

类别子类别批准新闻

我尝试使用数据透视表但无法获得结果

型号如下

新闻栏目

class NewsSection extends Model
{
     public function categories()
    {
    return $this->belongsToMany(Category::class);
    }
}

类别

class Category extends Model
{
    public function subcats(){
       return $this->belongsToMany(SubCategory::class);
    }
    public function newssections(){
      return $this->belongsToMany(NewsSection::class);
    }
}

子类别

class SubCategory extends Model
{
    public function category(){
     return $this->belongsTo(Category::class);
    }

    public function approvednews(){
     return $this->belongsToMany(ApprovedNews::class);
    }

   public function pendingnews(){
     return $this->belongsToMany(PendingNews::class);
   }

}

已批准新闻

class ApprovedNews extends Model
{

    public function subcategories (){
     return $this->belongsToMany(SubCategory::class);
   }
}

待定新闻

class PendingdNewsextends Model
{

    public function subcategories (){
     return $this->belongsToMany(SubCategory::class);
    }
}

更新 这是我到目前为止所做的

$news =Category::with('subcats.approvednews')->where('id',1)->get();

我得到了所有已批准的新闻,包括子类别和类别

如果我这样做,我如何修改它以获得每个类别的特定子类别和批准的新闻

$news =Category::with('subcats.approvednews')->where('subcats.id',1)->get();

我收到类似 id ambiguous 的错误

是否可以从关系中挑选项目,例如 return 仅 2 个子目录 3 个批准的新闻 所选类别

的每个子目录

获取每个 subcat 已批准新闻 未决新闻 的计数]类别

提前致谢

关于如何让它发挥作用,我有一些建议。在您的评论中,您说您在执行以下操作时遇到问题:

$items=Category::with('subcategory')->where('id',1)->get();

'subcategory'从哪里来?从模型的外观来看,Category 和 Subcategory 之间的关系称为 subcats。所以您需要将其更改为:

$items=Category::with('subcats')->where('id',1)->get();

如果你把它转储出来,你应该会看到你将获得 ID 为 1 的类别,并加载子类别。测试你的关系是否有效的方法如下所示:

$category = Category::find(1);
$subCats = $category->subcats()->get();
dd($subCats);

在您的人际关系中,我建议您尝试 return $this->belongsToMany('App\SubCategory'); 而不是使用 SubCategory::class,这样模型肯定是相互关联的。

一旦你测试了彼此之间的关系有效,你就可以开始测试你可以从 a->b->c 等。

错误"error like id ambiguous"意味着您需要在where('id', 1)中指定table,例如where('table.id', 1),以便MySQL知道哪个id 你指的是 table 列。

你可以constrain the models returned by with这样:

Category::with(['subcats' => function(Builder $query) {
    $query->where('id', '=', 1);
}]);

你也可以count relations:

$subcat = SubCategory::withCount(['approvednews']);
$subcat->approvednews_count;

限制急切加载关系是不可能的per the docs

解决方法可能是从 ApprovedNews:

开始反过来
ApprovedNews::whereHas(['subcategories' => function(Builder $query) {
    $query->where('id', '=', 1);
}])->limit(10);

可能正在使用 "Nested Eager Loading" 和 "scope",你可以做类似

$pendings = NewSection::with('categories.subCategories')->pending()->get()
$approved = NewSection::with('categories.subCategories')->approved()->get()

没有测试过,但你可以试试,可能稍作修改,就可以达到你的目标。

如果你想要return一个合集,你可以合并它

$approved->merge($pendings);

但是,你应该避免它。