Laravel 如何从“文章”表中获取没有类别的所有记录?
Posted
技术标签:
【中文标题】Laravel 如何从“文章”表中获取没有类别的所有记录?【英文标题】:How in Laravel to get all records from "articles" table that do not have a category? 【发布时间】:2021-06-09 08:44:23 【问题描述】:数据库有三个表:
“文章”->“id(int),title(varchar)”, “类别”->“id (int), title(varchar)”和 "categoryables" -> "category_id (int), categoryable_id (int), categoryable_type(varchar)"。我还有两个模型用于处理这些“文章”和“类别”表,但我没有“可分类”模型
我使用“文章”模型中的多对多多态关系获取与特定文章相关的所有类别:
public function categories()
return $this->morphToMany(Category::class, 'categoryable');
由此我得出结论,Laravel 本身创建了一个“可分类”模型和一个称为“可分类”的关系。
此外,我可以使用“类别”模型中的关系“articles()”获取属于特定类别的所有文章:
public function articles()
return $this->morphedByMany(Article::class, 'categoryable');
但我也有不属于任何类别的文章。
如何获取不属于任何类别的文章?
【问题讨论】:
看来您必须直接从“文章”表中获取它们,因为没有类别意味着它们不会出现在数据透视表中。获取所有文章是否对您有用,然后创建一个新数组并映射 getArticles 查询的结果,该查询返回所有文章,以及 catagory=null (或空或其他)将其设置为“未分类”的任何地方' 在新数组中?然后你可以返回那个新数组,因为所有文章现在都有某种形式的分类,即使它只是“未分类”。 @user6854465 为所有文章创建数据透视表条目是个好主意,即使是那些没有类别的文章。请告诉我如何实现这一点,如果我想在“category_id”字段中添加一个 NULL 值,如果需要在“categoryables”表中,在从文章模型中创建、更新和删除记录时? 【参考方案1】:我通过join查询解决了这个问题,如果有人需要,我发布我的解决方案。
由于我需要数据来构建菜单,即在网站的所有页面上,我决定创建一个服务提供者“MenuServiceProvider”,这样我就不会每次都在控制器中询问相同的查询。
在服务提供者中,我创建了以下方法并使用左连接进行查询:
// 没有分类的文章
public function articles_without_category()
View::composer('site.category', function ($view)
$articles_without_category = Article::leftJoin('categoryables', function ($joun)
$joun->on('articles.id', '=', 'categoryables.categoryable_id')
->whereNull('categoryable_id');
)->where('published', 1)->paginate(10);
$view->with([
'category' => Category::where('slug', 'like', '%without-category%')->first(),
'articles' => $articles_without_category,
]);
);
此查询在 MenuServiceProvider 的 Boot 方法中调用如下:
public function boot(Request $request)
if ($request->is('category/without-category*'))
$this->articles_without_category();
【讨论】:
以上是关于Laravel 如何从“文章”表中获取没有类别的所有记录?的主要内容,如果未能解决你的问题,请参考以下文章