Выберите конкретный столбец, только если соответствует идентификатору в Eloquent - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть запрос Eloquent, который выглядит следующим образом:

return $contest->join('posts','contests.id','posts.contest_id')
                    ->join('winners', 'contests.winner_id', 'winners.id')
                    ->where('posts.user_id', $id)
                    ->where('winners.gold_user_id', $id)
                    ->orWhere('winners.silver_user_id', $id)
                    ->orWhere('winners.bronze_user_id', $id)
                    ->orderBy('contests.created_at', 'desc');

В SQL:

select * from `contests` 
    inner join `posts` on `contests`.`id` = `posts`.`contest_id` 
    inner join `winners` on `contests`.`winner_id` = `winners`.`id` 
    where `posts`.`user_id` = 4 
    and `winners`.`gold_user_id` = 4
    or `winners`.`silver_user_id` = 4 
    or `winners`.`bronze_user_id` = 4 
    order by `contests`.`created_at` desc

Но моя проблема в том, что он отображает все остальные записи о конкурсах, где идентификаторнайдено.

Это моя таблица победителей:

enter image description here

Что я хочу сделать, это проверить, является ли пользователь золотым,серебряный или бронзовый победитель.Теперь, с моим запросом, он выбирает все столбцы, в которых совпадает строка идентификатора.Как я могу достичь своей цели?

1 Ответ

0 голосов
/ 25 февраля 2019

Поместите OR conditions в круглые скобки - как показано ниже

select * from `contests` 
    inner join `posts` on `contests`.`id` = `posts`.`contest_id` 
    inner join `winners` on `contests`.`winner_id` = `winners`.`id` 
    where `posts`.`user_id` = 4 
    and (`winners`.`gold_user_id` = 4
    or `winners`.`silver_user_id` = 4 
    or `winners`.`bronze_user_id` = 4)
    order by `contests`.`created_at` desc

OP ELOQUENT QUERY

return $contest->join('posts','contests.id','posts.contest_id')
                    ->join('winners', 'contests.winner_id', 'winners.id')
                    ->where('posts.user_id', $id)
                    ->where(function($query) use ($id) {
                        $query->where('winners.gold_user_id', $id)
                                ->orWhere('winners.silver_user_id', $id)
                                ->orWhere('winners.bronze_user_id', $id);
                    })
                    ->orderBy('contests.created_at', 'desc');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...