Laravel сортировка с определенным статусом вверху

Есть коллекция кандидата и коллекция запросов. Нужно отсортировать коллекцию кандидатов (candidates) так, чтобы вначале выводились записи со статусом (requests.status) = 11, а потом с остальными статусами c обычной сортировкой (asc, desc).


Ответы (1 шт):

Автор решения: Kostiantyn Okhotnyk

Для этого необходимо использовать ordering Допустим у вас есть модель CandidatesModel, связанная сущность с таблицей candidates. И связанная с ним модель запросов RequestsModel. Предположим, что они связанны один к одному (1 кандидат на 1 запрос) и по какому то внешнему ключу request_id в таблице candidates;

class CandidatesModel extends Model
{
    protected $table = 'candidates';

    public function requests()
    {
        return $this->hasOne( RequestsModel::class, 'id', 'request_id');
    }

   public static function getTableName() {
      return with(new static)->getTable();
   }
}




class RequestsModel extends Model
{
   protected $table = 'requests';

   public static function getTableName() {
      return with(new static)->getTable();
   }

}

Теперь выбираем кандидатов и сортировкой по статусу

CandidatesModel::all()->with('requests')-> orderBy('requests.status', 'ASC')->get();

где requests - это таблица

Также можно использовать сделать выборку через join


  $candidates = CandidatesModel::join(
      RequestsModel::getTableName(), CandidatesModel::getTableName().'.request_id', '=', RequestsModel::getTableName().'.id'
  )
  ->orderBy(RequestsModel::getTableName().'.status', 'ASC')->get();

→ Ссылка