Как Сортировать Данные, Связанные с моделью?
Меня есть следующие отношения в моем приложении:
Модель Клиент:
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)...
это всего лишь пример, у меня есть несколько отношений, в моем приложении, что мне нужно применить этот фильтр сортировки, как я могу это сделать?
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
и тому подобное (несколько связей).