Как Сортировать Данные, Связанные с моделью?


Меня есть следующие отношения в моем приложении:

Модель Клиент:

class Cliente extends Model
{
    protected $table = 'clientes';

    public function Usuario(){ 
        return $this->hasMany('App\Models\Admin\Usuario', 'id_cliente');
    }    
}

Модель Usuario:

class Usuario extends Model
{
    protected $table = 'usuarios';

    public function Cliente(){ 
        return $this->belongsTo('App\Models\Admin\Cliente', 'id_cliente'); 
    }
}

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

@foreach($Cliente->Usuario as $usuario)...

это всего лишь пример, у меня есть несколько отношений, в моем приложении, что мне нужно применить этот фильтр сортировки, как я могу это сделать?

Author: Raylan Soares, 2016-04-18

1 answers

В Laravel можно сделать зарядку, уведомления, результаты, отношения определенного model. Таким образом, вместе с этой зарядке, вы также можете добавить условия, которые будут применяться к отношениям, которые загружаются вместе с вашим запросом. Это делается с помощью метода with (когда вы хотите использовать его, он должен быть первый метод называется).

В контроллере, вы можете сделать так:

$with['usuarios'] = function ($query) {
    return $query->orderBy('nome');
};

$cliente = Cliente::with($with)->find($id);

, Или вы также можете отделить два, и сделать второй запрос, чтобы пользователи на основе запроса клиента.

 $cliente = Cliente::find($id);

 $usuarios = $cliente->usuarios()->orderBy('nome')->get();

Во втором примере, вы должны были бы сделать foreach $usuarios.

Употреблять в коллекции

Также можно отсортировать данные отношения после завершения запроса.

Например, я хочу, чтобы отсортировать моих пользователей, которые связаны с клиентом по имени. А затем я перечислю их снова и сортировать их по дате обновления.

, вместо того, чтобы два запросы, вы можете сделать так:

#controller

 $cliente = Cliente::with('usuarios')->find($id);

 $ordenadores['nome'] = function ($usuario)
 {
      return $usuario->nome;
 };

 $ordenadores['atualizacao'] = function ($usuario)
 {
        return $usuario->created_at;
 };

 return view('minha_view', compact('cliente', 'ordenadores'));

Там в view, вы можете сделать так:

#view

@foreach($cliente->usuarios->sortBy($ordenadores['nome']) as $usuario)

@endforeach


@foreach($client->usuarios->sortBy($ordenadores['atualizacao']) as $usuario)

@endforeach

Примечание: В некоторых случаях, нет необходимости использовать Callback sortBy. Просто передать имя поля как аргумент sortBy, отсортировать данные в коллекции.

@foreach($client->usuarios->sortBy('created_at') as $usuario)

@endforeach

Совет

Обычно, для того чтобы сохранить читаемость методы его модель, я полагаю, что используйте единственного числа, отношений " один к одному) belongsTo и hasOne, и во множественном числе hasMany belongsToMany и тому подобное (несколько связей).

 4
Author: Wallace Maxters, 2020-06-11 14:45:34