Сортировать коллекцию Laravel по индивидуальному заказу, кроме asc или desc - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть этот массив как Laravel Collection:

"data": [
  {
    "id": 863368,
    "reference": "Ref 1",
    "status": 1
  },
  {
    "id": 863391,
    "reference": "Ref 2",
    "status": 2
  },
  {
    "id": 863390,
    "reference": "Ref 3",
    "status": 2
  },
  {
    "id": 863396,
    "reference": "Ref 4",
    "status": 3
  }
];

И мне нужно отсортировать его по status, а не по asc или desc, но записи со статусом 2 должныбыть первым в списке, затем статус 1, затем статус 3.

Я не могу понять, как этого добиться, заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Если вы получаете данные из MySQL, вы можете просто изменить ORDER BY следующим образом:

ORDER BY FIELD(status, 2, 1, 3)
0 голосов
/ 19 февраля 2019

Вы можете получить это, используя orderByRaw

Model::orderByRaw('FIELD(status, 2, 1, 3)')->get();

Также используя orderBy

Model::orderBy(DB::raw('FIELD(status, 2, 1, 3))'))->get();
0 голосов
/ 19 февраля 2019

Привет был похожая проблема,

$final = $collection->sortBy(function($item){
    return array_search($item->status, ['2', '1', '3']);
});

['2', '1', '3'] (Статус с номером 2 будет первым, потому что его клавиша позиции равна 0, просто измените порядок, как вам нужно.

Иливы можете создать array как ['2' => 1, '1' => 2, '3' => 3]

использовать как return $arry_of_order[$item->status]; (быстрее, чем каждый раз вызывать array_search)

PS Если вы можете использовать DB (MySql), как другиелюди здесь предложили, вы должны придерживаться этого, $query->orderByRaw("FIELD(status, '2', '1', '3')")

Для PostgreSQL смотрите здесь

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