Как использовать Порядок по нескольким столбцам в Laravel 4?

#php #mysql #laravel #eloquent

Вопрос:

Я хочу отсортировать несколько столбцов в Laravel 4, используя метод orderBy() в Laravel Eloquent. Запрос будет сгенерирован с помощью такого красноречивого:

 SELECT *
FROM mytable
ORDER BY
  coloumn1 DESC, coloumn2 ASC
 

Как я могу это сделать?

Комментарии:

1. Очень просто. User::orderBy('name', 'DESC') ->orderBy('email', 'ASC') ->get();

Ответ №1:

Просто вызывайте orderBy() столько раз, сколько вам нужно. Например:

 User::orderBy('name', 'DESC')
    ->orderBy('email', 'ASC')
    ->get();
 

Выдает следующий запрос:

 SELECT * FROM `users` ORDER BY `name` DESC, `email` ASC
 

Комментарии:

1. Было бы неплохо, если бы мы могли передать массив, подобный: User::orderBy(array('name'=>'desc', 'email'=>'asc'))

2. @FireCoding, вы можете сделать $user->orders = array(array('column' => 'name', 'direction' => 'desc'), array('column' => 'email', 'direction' => 'asc'));

3. Есть ли способ добавить заказ по установленному запросу?

4. @Рафаэль, если вы еще не запустили его (позвонили get или first ), просто позвоните orderBy по нему. Иначе, нет.

5. В противном случае, если вам всегда нужно заказывать по desc, вы также можете использовать функцию latest ().

Ответ №2:

Вы можете сделать так, как указал @rmobis в своем ответе, [Добавив в него что-то еще]

Использование order by дважды:

 MyTable::orderBy('coloumn1', 'DESC')
    ->orderBy('coloumn2', 'ASC')
    ->get();
 

и второй способ сделать это -,

С помощью raw order by :

 MyTable::orderByRaw("coloumn1 DESC, coloumn2 ASC");
    ->get();
 

Оба будут выдавать один и тот же запрос, как показано ниже,

 SELECT * FROM `my_tables` ORDER BY `coloumn1` DESC, `coloumn2` ASC
 

Как указано @rmobis в комментарии к первому ответу, вы можете передавать как массив для упорядочения по столбцам, как это,

 $myTable->orders = array(
    array('column' => 'coloumn1', 'direction' => 'desc'), 
    array('column' => 'coloumn2', 'direction' => 'asc')
);
 

еще один способ сделать это- iterate в цикле,

 $query = DB::table('my_tables');

foreach ($request->get('order_by_columns') as $column => $direction) {
    $query->orderBy($column, $direction);
}

$results = $query->get();
 

Надеюсь, это поможет 🙂

Комментарии:

1. могу ли я использовать orderByRaw И OrderBy вместе? похоже, это не работает для меня, результирующий запрос, похоже, только уважает orderByRaw

2. попробуйте сначала поставить OrderBy, а затем orderByRaw и посмотрите результат @GeorgeAvgoustis

3. к сожалению, это невозможно сделать, так как сначала его нужно рандомизировать, а затем упорядочить по окончательному классификатору.

4. Это действительно работает вместе, возможно, потому, что, применяя сортировку по первому столбцу, вы не видите сортировку по второму столбцу

Ответ №3:

Вот еще одна уловка, которую я придумал для своего базового класса репозитория, где мне нужно было упорядочить по произвольному количеству столбцов:

 public function findAll(array $where = [], array $with = [], array $orderBy = [], int $limit = 10)
{
    $result = $this->model->with($with);
    $dataSet = $result->where($where)
        // Conditionally use $orderBy if not empty
        ->when(!empty($orderBy), function ($query) use ($orderBy) {
            // Break $orderBy into pairs
            $pairs = array_chunk($orderBy, 2);
            // Iterate over the pairs
            foreach ($pairs as $pair) {
                // Use the 'splat' to turn the pair into two arguments
                $query->orderBy(...$pair);
            }
        })
        ->paginate($limit)
        ->appends(Input::except('page'));

    return $dataSet;
}
 

Теперь вы можете позвонить вот так:

 $allUsers = $userRepository->findAll([], [], ['name', 'DESC', 'email', 'ASC'], 100);
 

Ответ №4:

Используйте порядок таким образом:

 return User::orderBy('name', 'DESC')
    ->orderBy('surname', 'DESC')
    ->orderBy('email', 'DESC')
    ...
    ->get();
 

Ответ №5:

 $this->data['user_posts'] = User_posts::with(['likes', 'comments' => function($query) { $query->orderBy('created_at', 'DESC'); }])->where('status', 1)->orderBy('created_at', 'DESC')->get();
 

Комментарии:

1. Ответы только на код не приветствуются, поэтому, пожалуйста, добавьте некоторые пояснения.