Заказ по CASE с другими значениями столбца в Laravel не работает - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь создать запрос Laravel, который должен значения порядка по большему количеству столбцов:

прежде всего по часам, и это работает, а также по значениям в столбце с именем «Competition_type» следующим образом:

  1. 'ATP - SINGLES'
  2. 'WTA - SINGLES'
  3. 'CHALLENGER MEN - SINGLES'
  4. 'CHALLENGER WOMEN - SINGLES'
  5. 'ITF MEN - SINGLES'
  6. 'ITF WOMEN - SINGLES'

Я пробовал этот запрос, но он работает .. .Я испробовал несколько подходов, и это мой последний:

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

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

$matches = Match::select("CASE 
           WHEN competition_type like '%ATP - SINGLES%' then 1
           WHEN competition_type like '%WTA - SINGLES%' then 2 
           WHEN competition_type like '%CHALLENGER MEN - SINGLES%' then 3
           WHEN competition_type like '%CHALLENGER WOMEN - SINGLES%' then 4
           WHEN competition_type  '%ITF MEN - SINGLES%' then 5
           WHEN competition_type = '%ITF WOMEN - SINGLES%' then 6 
           END DESC")
           ->select('matches.*');

Дело в том, что если я добавлю "order by" перед регистром, это выдаст мне ошибку. Как мне изменить мой запрос, чтобы значения столбцов были такими, как я упоминал?

1 Ответ

1 голос
/ 27 января 2020

Вы должны использовать selectRaw для такого типа запроса.

$matches = Match::selectRaw('CASE
    WHEN competition_type LIKE "%ATP - SINGLES%" THEN 1
    WHEN competition_type LIKE "%WTA - SINGLES%" THEN 2
    WHEN competition_type LIKE "%CHALLENGER MEN - SINGLES%" THEN 3
    WHEN competition_type LIKE "%CHALLENGER WOMEN - SINGLES%" THEN 4
    WHEN competition_type LIKE "%ITF MEN - SINGLES%" THEN 5
    WHEN competition_type LIKE "%ITF WOMEN - SINGLES%" THEN 6
    END
AS type_number')
->orderBy('type_number', 'asc')
->get();

Или, может быть, вы хотите использовать запрос ORDER BY CASE? В этой ситуации, возможно, вам стоит попробовать метод orderByRaw.

$matches = Match::orderByRaw('CASE
    WHEN competition_type LIKE "%ATP - SINGLES%" THEN 1
    WHEN competition_type LIKE "%WTA - SINGLES%" THEN 2
    WHEN competition_type LIKE "%CHALLENGER MEN - SINGLES%" THEN 3
    WHEN competition_type LIKE "%CHALLENGER WOMEN - SINGLES%" THEN 4
    WHEN competition_type LIKE "%ITF MEN - SINGLES%" THEN 5
    WHEN competition_type LIKE "%ITF WOMEN - SINGLES%" THEN 6
    END DESC')
->get();
...