Отображать результаты на основе заявления orWhere - PullRequest
1 голос
/ 08 июня 2019

Я пытаюсь понять, как использовать приставку orWhere в laravel.Я создаю небольшое приложение, позволяющее (игровым) кланам бросать вызов другим кланам, либо бросать вызов клану напрямую, либо бросать вызов матчу другого клана.

Клан может создать матч или бросить вызов другой команде,совпадение автоматически создается с логическим значением, которое соответствует вызову.Клан, который бросает вызов другому клану, всегда является «командой домашней игры».

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

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

$receivedChallenges = DB::table('challenges')
->select(
    'matches.id as id',
    'matches.date as date',
    'matches.time as time',
    'challenges.id as challenge_id',
    DB::raw('count(challenges.id) as challenge_amount')
)
->leftjoin('matches', 'matches.id', '=', 'challenges.match_id')
->leftjoin('team_user as ht', 'ht.team_id', '=', 'matches.home_id')
->leftjoin('team_user as at', 'at.team_id', '=', 'matches.away_id')
->where('matches.played', '=', false)
->where('matches.planned', '=', false)
->where(function($query) use ($team_id_arr) {
    $query
    ->where('matches.challenge', '=', true)
    ->where('at.user_id', '=', auth()->user()->id)
    ->where('challenges.opponent_id', 'matches.away_id')

    // Or where...
    ->orWhere('matches.challenge', '=', false)
    ->where('challenges.opponent_id', $team_id_arr);
})
->havingRaw('count(challenges.id) > ?', [0])
->groupBy('matches.id')
->get();

Когда матч является вызовом, текущий пользователь входит в «команду выездной игры», таким образом, являясь opponent_id в таблице испытаний.

Если совпадение не является вызовом, текущий пользователь всегда заполняет клан opponent_id в таблице испытаний.

Я использую havingRaw, чтобы отображать только совпадения, в которых есть вызов, и яхочу отсортировать все на основе matches.id.Является ли мое использование orWhere правильным, потому что в настоящее время полученные вызовы для моего фиктивного клана не отображаются на моей странице.

1 Ответ

1 голос
/ 08 июня 2019

В SQL (например, mySQL),

A AND B AND C OR D AND E

будет интерпретироваться как

(A AND B AND C) OR (D AND E).

Но поскольку Eloquent позволяет создавать запросы с командами в любом порядке, некоторые методы из SQL должны переводиться по-разному.

В случае orWhere я настоятельно рекомендую выделить два альтернативных предложения.

$receivedChallenges = DB::table('challenges')
->select(
    'matches.id as id',
    'matches.date as date',
    'matches.time as time',
    'challenges.id as challenge_id',
    DB::raw('count(challenges.id) as challenge_amount')
)
->leftjoin('matches', 'matches.id', '=', 'challenges.match_id')
->leftjoin('team_user as ht', 'ht.team_id', '=', 'matches.home_id')
->leftjoin('team_user as at', 'at.team_id', '=', 'matches.away_id')
->where('matches.played', '=', false)
->where('matches.planned', '=', false)
->where(function($query) use ($team_id_arr) {
    $query->where(function($query){
        $query
        ->where('matches.challenge', '=', true)
        ->where('at.user_id', '=', auth()->user()->id)
        ->where('challenges.opponent_id', 'matches.away_id')
    })->orWhere(function($query) use($team_id_arr){
        $query
        ->where('matches.challenge', '=', false)
        ->where('challenges.opponent_id', $team_id_arr);
    });
})
->havingRaw('count(challenges.id) > ?', [0])
->groupBy('matches.id')
->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...