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 如何从“文章”表中获取没有类别的所有记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何从其他表中获取所需的列

页面的类别信息

Laravel:如何从具有关系的 3 个表中获取数据

E08:后台管理系统开发-读取添加文章页面的类别信息

使用 laravel 模型获取数据时没有从表中获取结果

如何使用laravel中另一个表中的外键获取所需的列