Как реализовать «где нет» в laravel eloquent построителя запросов - PullRequest
1 голос
/ 16 апреля 2019

Что такое эквивалентный elaquent конструктор запросов laravel для этого фрагмента mysql sql:

select * from `posts` left join `user_post_interactions` on `posts`.`id` = `user_post_interactions`.`post_id` where `posts`.`user_id` = 10 and not (`user_post_interactions`.`interaction_name` = 'hide' and `user_post_interactions`.`user_id` = 10)

Что я делаю:

$this->posts()->leftJoin('user_post_interactions', 'posts.id', '=', 'user_post_interactions.post_id')
            ->where(function($q) {
                $q->where('user_post_interactions.interaction_name', '<>', 'hide')
                    ->where('user_post_interactions.user_id', '<>', 10);
            });

Но это не дает ожидаемого результата

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Вы можете использовать whereHas () , который будет запрашивать только те сообщения, которые имеют interaction, где user_id не равно 10:

$this->posts()->whereHas('interactions', function ($query) {
    $query->where('user_id', '!=', 10);
})->get();

Обратите внимание, что для этого потребуется модель Interaction с отношением interactions() на модели Post.

Если вы хотите включить в запрос interactions, добавьте ->with('interactions') в цепочку запросов.

1 голос
/ 16 апреля 2019

Вы можете просто запустить:

$this->posts()->with(['interaction' => function($query){
            return $query->where("interaction_name","!=",'hide')
                ->where("user_id","!=",10);
        }]);

Если вы хотите фильтровать взаимодействие

$this->posts()->whereHas('interaction', function($query){
            return $query->where("interaction_name","!=",'hide')
                ->where("user_id","!=",10);
        });

здесь я предполагаю, что ваша таблица posts имеет отношение interaction

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