Laravel порядок запросов не работает - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь построить запрос laravel, который должен упорядочить значения в столбце с именем "Competition_type" следующим образом: «ATP - SINGLES», «WTA - SINGLES», «CHALLENGER MEN - SINGLES», «CHALLENGER WOMEN» - ОДИНОЧНЫЕ »,« МУЖЧИНЫ-МУЖЧИНЫ-МУФТЫ »,« ЖЕНЩИНЫ-МНОГОЦВЕТЫ-МФТ », и я попробовал этот запрос, но он работает ...

$matches = Match::select()
           ->where('date', $date)->where('pick_score', '<>', '0');
$matches = $matches->orderBy('hour', 'ASC');
$matches = $matches->orderBy(Match::raw("case when competition_type in ('ATP - SINGLES', 'WTA - SINGLES") then -1 else competition_type end, competition_type'));

Что я должен изменить, чтобы заставить его работать?

Ответы [ 3 ]

0 голосов
/ 24 января 2020

Вы можете заархивировать это с помощью следующего запроса, код будет более читабельным с помощью метода преобразования, который доступен в Eloquent / Collection.

Match::select()
    ->whereDate($date)
    ->where('pick_score', '<>', '0')
    ->orderBy('hour')
    ->transform(function ($match) {
        if(
            $match->competition_type == "ATP - SINGLES" 
            or
            $match->competition_type == "WTA - SINGLES"
        ){
            $match->competition_type = -1;
        }else{
            $match->competition_type = 'competition_type';
        }
        return $match;
    })
    ->sortBy('competition_type')

Примечание: вы можете использовать Dynami c Где условия в laravel, гдеFiledName (значение)

0 голосов
/ 25 января 2020
  1. есть синтаксис с вашими кавычками, замените одинарные кавычки на двойные кавычки, чтобы он мог включать 'ATP - SINGLES' et c:
"case when competition_type in ('ATP - SINGLES', 'WTA - SINGLES') then -1 else competition_type end, competition_type"

изменить Match::raw() на DB::raw()

У вас есть два orderBy, вам нужно сделать это одно, если вы хотите заказать по hour и затем сделайте заказ по competition_type, вам нужно сделать это так:

orderBy('hour', DB::raw("CASE WHEN competition_type IN ('ATP - SINGLES', 'WTA - SINGLES') then -1 ELSE competition_type END"))

Итак, ваш код будет выглядеть так:

$matches = Match::where('date', $date)
                ->where('pick_score', '<>', '0');

$matches = $matches->orderBy('hour', DB::raw("CASE WHEN 
                                      competition_type IN ('ATP - SINGLES', 'WTA - SINGLES') then -1 
                                      ELSE competition_type END"))
                  // you can remove case when from select, I just select it out for you can proofread better
                  ->select('match.*', DB::raw("CASE WHEN 
                                      competition_type IN ('ATP - SINGLES', 'WTA - SINGLES') then -1 
                                      ELSE competition_type END"));
0 голосов
/ 24 января 2020

Попробуйте это

$matches = Match::select()
           ->where('date', $date)->where('pick_score', '<>', '0');
$matches_with_asc_order = $matches->orderBy('hour', 'ASC');

$matches_with_orderby = $matches->orderBy(Match::raw("case when competition_type in ('ATP - SINGLES', 'WTA - SINGLES') then -1 else competition_type end, competition_type"));

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