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);
但是,你应该避免它。
我有多个具有多对多关系的模型
这是模型
- 新闻栏目
- 类别
- 子类别
- 批准的新闻
- 待处理新闻
每个新闻栏目可以有多个类别。
每个类别可以有多个子类别。
每个子类别可以有多个已批准的新闻和待定的新闻。
我想要 新闻 和 类别、子类别 和 待定/批准新闻
以及诸如
之类的东西类别和子类别和批准新闻
我尝试使用数据透视表但无法获得结果
型号如下
新闻栏目
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);
但是,你应该避免它。