@Nilmir

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

Есть простая модель
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;

class Workers extends Model
{
    public $timestamps = false;
}


И контролер

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Workers;

class WorkersController extends Controller
{
    function orderBy(Request $request )
    {          
        $data =Workers::all()->sortBy('name');
        dd($data[0],$data[1],$data[2]);
    }
}


Сортировка не применяется записи по прежнему отсортированы по id. Подскажите, что не так?

Эдит. Скрин первых записей в таблице.
5af5748c48b0c199488646.png
Результат дай дампа dd():
Workers {#52941
  +timestamps: false
  #connection: "mysql"
  #table: null
  #primaryKey: "id"
  #keyType: "int"
  +incrementing: true
  #with: []
  #withCount: []
  #perPage: 15
  +exists: true
  +wasRecentlyCreated: false
  #attributes: array:7 [
    "id" => 1
    "name" => "Bulah Carroll"
    "position" => "et"
    "salary" => 18880
    "work_permit" => "1984-03-21"
    "parent_id" => 0
    "tree_lvl" => 1
  ]
  #original: array:7 [
    "id" => 1
    "name" => "Bulah Carroll"
    "position" => "et"
    "salary" => 18880
    "work_permit" => "1984-03-21"
    "parent_id" => 0
    "tree_lvl" => 1
  ]
  #changes: []
  #casts: []
  #dates: []
  #dateFormat: null
  #appends: []
  #dispatchesEvents: []
  #observables: []
  #relations: []
  #touches: []
  #hidden: []
  #visible: []
  #fillable: []
  #guarded: array:1 [
    0 => "*"
  ]
}

Workers {#52942
  +timestamps: false
  #connection: "mysql"
  #table: null
  #primaryKey: "id"
  #keyType: "int"
  +incrementing: true
  #with: []
  #withCount: []
  #perPage: 15
  +exists: true
  +wasRecentlyCreated: false
  #attributes: array:7 [
    "id" => 2
    "name" => "Jaylan Wisozk PhD"
    "position" => "consequuntur"
    "salary" => 18922
    "work_permit" => "2006-07-28"
    "parent_id" => 1
    "tree_lvl" => 2
  ]
  #original: array:7 [
    "id" => 2
    "name" => "Jaylan Wisozk PhD"
    "position" => "consequuntur"
    "salary" => 18922
    "work_permit" => "2006-07-28"
    "parent_id" => 1
    "tree_lvl" => 2
  ]
  #changes: []
  #casts: []
  #dates: []
  #dateFormat: null
  #appends: []
  #dispatchesEvents: []
  #observables: []
  #relations: []
  #touches: []
  #hidden: []
  #visible: []
  #fillable: []
  #guarded: array:1 [
    0 => "*"
  ]
}

Workers {#52943
  +timestamps: false
  #connection: "mysql"
  #table: null
  #primaryKey: "id"
  #keyType: "int"
  +incrementing: true
  #with: []
  #withCount: []
  #perPage: 15
  +exists: true
  +wasRecentlyCreated: false
  #attributes: array:7 [
    "id" => 3
    "name" => "Jordi Gusikowski"
    "position" => "vel"
    "salary" => 19172
    "work_permit" => "1973-01-26"
    "parent_id" => 1
    "tree_lvl" => 2
  ]
  #original: array:7 [
    "id" => 3
    "name" => "Jordi Gusikowski"
    "position" => "vel"
    "salary" => 19172
    "work_permit" => "1973-01-26"
    "parent_id" => 1
    "tree_lvl" => 2
  ]
  #changes: []
  #casts: []
  #dates: []
  #dateFormat: null
  #appends: []
  #dispatchesEvents: []
  #observables: []
  #relations: []
  #touches: []
  #hidden: []
  #visible: []
  #fillable: []
  #guarded: array:1 [
    0 => "*"
  ]
}

Workers {#52944
  +timestamps: false
  #connection: "mysql"
  #table: null
  #primaryKey: "id"
  #keyType: "int"
  +incrementing: true
  #with: []
  #withCount: []
  #perPage: 15
  +exists: true
  +wasRecentlyCreated: false
  #attributes: array:7 [
    "id" => 4
    "name" => "Magnus Christiansen"
    "position" => "et"
    "salary" => 14109
    "work_permit" => "1981-12-01"
    "parent_id" => 1
    "tree_lvl" => 2
  ]
  #original: array:7 [
    "id" => 4
    "name" => "Magnus Christiansen"
    "position" => "et"
    "salary" => 14109
    "work_permit" => "1981-12-01"
    "parent_id" => 1
    "tree_lvl" => 2
  ]
  #changes: []
  #casts: []
  #dates: []
  #dateFormat: null
  #appends: []
  #dispatchesEvents: []
  #observables: []
  #relations: []
  #touches: []
  #hidden: []
  #visible: []
  #fillable: []
  #guarded: array:1 [
    0 => "*"
  ]
}
  • Вопрос задан
  • 4832 просмотра
Решения вопроса 2
@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()

Если вы получаете коллекцию из БД, то эффективнее делать сортировку непосредственно на стороне БД, в остальных случаях учитывайте описанное поведение коллекций.
Ответ написан
xpert13
@xpert13
Full Stack Developer
Используйте сортировку средствами СУБД:
$data = Workers::orderBy('name')->get();

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

Войдите, чтобы написать ответ

Похожие вопросы