首页 > 解决方案 > 在多个相关表中执行满足条件的 Laravel Eloquent 'select' 语句

问题描述

我有一个带有表的博客数据库架构postscategories还有更多。对于posts表中的每条记录,都有一列post_category包含表中记录的 id categories。还有标志字段(用于表格)post_active分别指示帖子/类别是否可供读取(如果 1 - 活动,如果 0 - 不活动)。cat_activecategories

例如:

表“帖子”:

+---------+------------+----------------+---------------+-------------+
| post_id | post_title |  post_content  | post_category | post_active |
+---------+------------+----------------+---------------+-------------+
|    1    | Lorem..... | ipsum dolor... |  1            | 1           |
+---------+------------+----------------+---------------+-------------+

表“类别”:

+--------+----------+------------+
| cat_id | cat_name | cat_active |
+--------+----------+------------+
| 1      | Category |  1         |
+--------+----------+------------+

目前,我正在使用 Eloquent 的where()子句从posts表中选择所有活动帖子:

$posts = Post::where('post_active', '=', 1)->get();

但是可能存在帖子处于活动状态(posts.post_active = 1)但整个类别不处于活动状态( )的情况categories.cat_active = 0。如何选择属于 Eloquent 活跃类别的所有活跃帖子?Vanilla SQL 语句也可以,它可以很容易地转换为 Eloquent。

任何帮助是极大的赞赏!

标签: phpmysqlsqllaravellaravel-5

解决方案


你可以使用 awhereHas来做你想做的事。

后模型

class Post ...
...
    public function categories()
    {
        return $this->belongsTo(Category::class, 'post_category', 'cat_id');
    }

然后你可以做

$posts = Post::where('post_active', '=', 1)
             ->whereHas('categories', function($q) {
                 $q->where('cat_active','=',1)
             })
             ->get();

这将仅过滤具有活动类别的帖子。


推荐阅读