Obtener una lista de relaciones ordenadas por campo pivote en Laravel.
Básicamente tengo usuarios que pertenecen a muchos usuarios. Podemos imaginar relaciones de amistad entre usuarios.
Así que tengo una tabla dinámica para la relación, con los id’s de 2 usuarios y un campo adicional ‘created_at’.
Tabla ‘users’: id, nombre
Tabla ‘friend_user’: user_id, friend_id, created_at
En mi modelo User, tengo una función ‘friends’ que devuelve una colección de usuarios:
public function friends() {
return $this->belongsToMany(User::class, ‘friend_user’, ‘user_id’, ‘friend_id’);
}
Mi objetivo es obtener la lista de todas las relaciones entre usuarios. Con un bucle en User::all(), puedo obtener fácilmente todas esas relaciones, usuario tras usuario:
$users = User::all();
foreach ( $users as $user ) {
foreach ( $user->friends as $friend ) {
return [$user->name . ‘ es amigo de ‘ . $friend->name];
}
}
Pero me gustaría obtenerlos ordenados por ‘created_at’, indiferentemente del usuario que esté en la relación.
¿Hay alguna forma fácil de hacer esto con Eloquent o tal vez de otra manera?
Gracias por tu ayuda.
davy.ai
Sí, hay una manera fácil de obtener la lista de todas las relaciones entre usuarios ordenadas por
created_at
utilizando Eloquent. Puedes modificar tu funciónfriends()
para incluir el métodowithPivot
y así acceder al campo adicionalcreated_at
en la tablafriend_user
. Luego, puedes modificar tu consulta para usar el métodoorderBy
y ordenar los resultados porcreated_at
. Aquí está el código actualizado:Con esta modificación, simplemente puedes llamar a
$user->friends
para obtener una colección de usuarios ordenados por el campocreated_at
en la tabla pivotfriend_user
.