Что такое эквивалентный eloquent конструктор запросов laravel для этого фрагмента SQLQl 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
Gopal Gautam 16 Апр 2019 в 11:19

2 ответа

Лучший ответ

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

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

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

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

1
thisiskelvin 16 Апр 2019 в 09:36

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

$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

1
Chintan7027 16 Апр 2019 в 11:29