Laravel - Eloquent до Json, а затем sortBy на json объект не работает - PullRequest
0 голосов
/ 20 июня 2020

У меня есть это json значение, которое я хочу сортировать, но по какой-то причине оно не работает.

    [
        {
            "id": 15028,
            "order_id": 342,         
            "user_id": 3,
            "status": "1",
            "priority": "1",
            "donedate": null,
            "user": {
                "id": 3,
                "name": "Max"
            }
        },
        {
            "id": 15030,
            "order_id": 341,         
            "user_id": 4,
            "status": "2",
            "priority": "1",
            "donedate": null,
            "user": {
                "id": 4,
                "name": "Jon"
            }
        }
    ]

Эта структура jSon является результатом Laravel преобразования красноречивого объекта с использованием $ object-> to Json ();

Теперь я сохраняю этот вывод в моем кеше Redis. Я хочу, чтобы при изменении статуса и / или приоритета любого порядка я хотел отсортировать этот jSon и сохранить его обратно в Redis.

$order_list = collect($json_decoded_with_updated_values);
$order_list = $order_list->sortBy('status')->sortBy('priority');
Redis::set(\GuzzleHttp\json_encode($stich_list_in_collection));
Redis::set("orders_list", $orders_list, 302400);

Однако я не получаю сортировку список. Чего я хочу добиться, так это того, что точно так же, как я бы запустил два-три orderBy в красноречивой модели, такой как orderBy ('status') -> orderBy ('priority') -> get () .. Я хочу запустить те же два сортировки в этом списке json.

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 20 июня 2020

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

$orderedList = $unorderedList->sortBy(function($item) {
  return $item->priority.'-'.$item->status;
});
0 голосов
/ 20 июня 2020

Я разобрался. На самом деле нам не нужен обратный звонок, как предлагает @brokedid. Мы можем сделать это, как показано ниже.

$order_list->sortBy('status')->sortBy('priority')->values()->all();

Так что мне не хватало части «-> values ​​() -> all ()». Я надеюсь, что если кто-нибудь столкнется с той же проблемой в будущем, он сможет получить из этого подсказку.

0 голосов
/ 20 июня 2020

Интересно, каков результат, если выбрать другое направление сортировки.

$order_list = $order_list->sortByDesc('status');
...