Выполните условия встречи оператора выбора Laravel Eloquent в нескольких связанных таблицах - PullRequest
0 голосов
/ 05 июля 2018

У меня есть схема базы данных блога с таблицами posts, categories и некоторыми другими. Для каждой записи в таблице posts имеется столбец post_category, содержащий идентификатор записи в таблице categories. Также имеются поля флага 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? Ванильный SQL-оператор также работает, его можно легко преобразовать в Eloquent.

Любая помощь очень ценится!

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

category.php

class Category {
    public function posts() {
        return $this->hasMany(Post::class, 'post_category', 'cat_id')->active();
    }
    public function scopeActive() {
        return $query->where('cat_active', 1);
    }
}

Post.php

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

    public function scopeActive() {
        return $query->where('post_active', 1);
    }
}

Ваш запрос будет:

$categories = Category::active()->with('posts')->get();

Или

$posts = Post::active()->has('category')->get();
0 голосов
/ 05 июля 2018

Вы можете использовать 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();

Это будет фильтровать только сообщения, которые имеют активную категорию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...