OrderByRaw () затем orderBy () в Laravel - PullRequest
       9

OrderByRaw () затем orderBy () в Laravel

0 голосов
/ 20 декабря 2018

Можно ли использовать следующее orderByRaw () .Этот метод orderByRaw () возвращает продукты в том же порядке, что и whereIn ().Прямо сейчас это только результаты в порядке orderByRaw, а не orderBy () .

Возможно ли объединить их:

$ids;
$placeholders = implode(',',array_fill(0, count($ids), '?'));
Product::whereIn('id', $ids)->orderByRaw("field(id,{$placeholders})" ,$ids)->orderBy('views', 'des')->orderBy('created_at', 'des')->get();

Редактировать: ЭтоSQL я получаю, когда делаю toSql ().Почему это не работает?

SELECT * 
FROM   `products` 
WHERE  `id` IN ( ?, ?, ?, ?, ? ) 
ORDER  BY Field(id, ?, ?, ?, ?, ?), 
          `views` DESC, 
          `created_at` DESC 

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Давайте представим простую ситуацию - вам нужно написать Eloquent запрос и упорядочить результат по разнице в два столбца.Или какой-то другой расчет.Время применить необработанный запрос!

Простой orderBy:

User::where('created_at', '>', '2016-01-01')
  ->orderBy('updated_at', 'desc')
  ->get();

Теперь, что если нам нужно упорядочить по разнице между updated_at и creation_at ?Выглядит это так:

User::where('created_at', '>', '2016-01-01')
  ->orderByRaw('(updated_at - created_at) desc')
  ->get();

Этот метод orderByRaw () , который не упомянут в официальной документации Laravel, будет применять порядок order by без изменения чего-либо витак, итоговый запрос будет таким:

select * from users 
  where created_at > '2016-01-01' 
  order by (updated_at - created_at) desc

обновить мой ответ замените

->orderBy('views', 'des')->orderBy('created_at', 'des')->get()

на

 ->orderBy('views', 'desc')->orderBy('created_at', 'desc')->get()

Надеюсь, что поможет!

0 голосов
/ 20 декабря 2018

Да, вы можете сделать это.Каждое предложение orderByRaw и orderBy возвращает построитель запросов, поэтому вы можете от них зацепиться.Если вы выводите ->toSql() в конце, вы можете увидеть сгенерированный вывод.

...