• Laravel сортировка выборки из бд с помощью sortBy?

    @Yan-s
    Создадим коллекцию эллементов с именами:
    $collection = collect([['name' => 'c'], ['name' => 'b'], ['name' => 'a']]);

    Дампним и посмотрим что у нас там:
    Collection {#581 ▼
      #items: array:3 [▼
        0 => array:1 [▼
          "name" => "c"
        ]
        1 => array:1 [▼
          "name" => "b"
        ]
        2 => array:1 [▼
          "name" => "a"
        ]
      ]
    }


    А теперь отсортируем и дампним снова dd($collection->sortBy('name'));:
    Collection {#566 ▼
      #items: array:3 [▼
        2 => array:1 [▼
          "name" => "a"
        ]
        1 => array:1 [▼
          "name" => "b"
        ]
        0 => array:1 [▼
          "name" => "c"
        ]
      ]
    }


    Как видите порядок в коллекции изменился, теперь она отсортирована по имени. Но, ключи сохранились прежние, поэтому вызов dd($data[0],$data[1],$data[2]); выведет значения в старом порядке.

    То есть сортировка будет сохранена при порядковом обходе коллекции, обращаясь по ключу вы нарушаете этот порядок.

    Метод values() вернет новую коллекцию, в которой ключи сбросятся и будут пронумерованы заново, по порядку, то есть ключи будут соответствовать сортировке
    $collection->values()

    Если вы получаете коллекцию из БД, то эффективнее делать сортировку непосредственно на стороне БД, в остальных случаях учитывайте описанное поведение коллекций.
    Ответ написан
    1 комментарий
  • Laravel сортировка выборки из бд с помощью sortBy?

    xpert13
    @xpert13
    Full Stack Developer
    Используйте сортировку средствами СУБД:
    $data = Workers::orderBy('name')->get();

    Настоятельно не рекомендую пользоваться функцией сортировки коллекций. Даже на небольших объемах - это очень медленный способ.
    Ответ написан
    1 комментарий