php - 执行Laravel Eloquent 'select'语句满足多个相关表中的条件

标签 php mysql sql laravel laravel-5

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

例如:

表“帖子”:

+---------+------------+----------------+---------------+-------------+
| 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。

非常感谢任何帮助!

最佳答案

您可以使用 whereHas 来执行您想要的操作。

发布模型

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();

这将仅过滤具有事件类别的帖子。

关于php - 执行Laravel Eloquent 'select'语句满足多个相关表中的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51197624/

相关文章:

php - PHP中可以嵌入Python吗?

php - MySQL 精确 URL 搜索

php - 完整日历颜色/文本颜色不起作用

mysql - 处理和存储分析数据的最佳方法

mysql - SQL 无法正常工作

sql - 使用什么数据结构来存储缓存 SQL 查询?

SQL : Retrieve inserted row IDs array/table

mysql - 如何查询 2 个 SQL 表并使用 1 个查询更改数据

javascript - 从 PHP Mysql 查询中将数据提取到 Javascript 中

php - 使用 Jquery 和 Ajax 更新文本字段边框