php - meaning - updateorcreate laravel
Laravel ORM Friendship Relationship sin duplicaciĆ³n (3)
No intente convertir lo que deberían ser dos filas en una fila, pero si va a intentar hacer eso, entonces definitivamente no necesita golpear la base de datos dos veces:
select * from users where (user_id = :user_id and friend_id = :friend_id) or (friend_id = :friend_id and user_id = :user_id)
Eso en Laravel sería:
Users::whereRaw(''(user_id = ? and friend_id = ?) or (friend_id = ? and user_id = ?)'', [
$user_id,
$friend_id,
$friend_id,
$user_id
]);
También podría hacer sudes para agruparlos, pero eso es un poco complicado.
¿Cuál es la mejor manera de modelar una relación de amistad con elocuente? Mi esquema de tabla está a continuación y me gustaría definir una relación en la que pueda recuperar a todos los amigos de la siguiente manera.
<?php
class User extends Eloquent {
public function friends() {
return $this->belongsToMany(''User'', ''friendships'', ''user_id'', ''friend_id'')->orWhere($this->id,''='', ''friend_id'');
}
}
+----+---------+-----------+----------+---------------------+---------------------+
| id | user_id | friend_id | state | created_at | updated_at |
+----+---------+-----------+----------+---------------------+---------------------+
| 1 | 3 | 1 | accepted | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 2 | 2 | 3 | accepted | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
+----+---------+-----------+----------+---------------------+---------------------+
La relación anterior está cerca de funcionar cuando busco amigos con la identificación de usuario de 3 obtengo los usuarios 1 y 3, pero obviamente quiero 1 y 2.
Mesa de amistad
user_id: la identificación del usuario que solicitó la amistad
friend_id: la identificación de usuario del amigo objetivo
estado: si la amistad está pendiente, aceptada o bloqueada.
created_at y updated_at
Soy consciente de que hay soluciones de Laravel. Muchas tablas de auto referencia solo funcionan de una manera en la que puedo recuperar a los amigos de ambos lados de la relación, pero debo tener dos filas, por ejemplo, si el usuario 1 y 3 son amigos, entonces una fila user_id = 3 y friend_id = 1, y en la siguiente fila viceversa. (O si no tengo dos filas, debo hacer dos consultas).
Podrías hacer dos búsquedas y usar una consulta de unión , y así solo llegar a la base de datos una vez. Pon todo esto en una función personalizada:
class User extends Eloquent {
public function friends()
{
$first = $this->belongsToMany(''User'', ''friendships'', ''user_id'', ''friend_id'');
return $this->belongsToMany(''User'', ''friendships'', ''friend_id'', ''user_id'')->union($first);
}
}
Tengo una sugerencia de que uses condiciones para cargar los mensajes que quieras
en este ejemplo digamos que usaste una consulta para cargar el ID_usuario y el ID_fiel con condición,
"select * from frienddship WHERE user_ID = ''$ id'' O friend_ID = ''$ id''"
$ id: es la identificación de usuario que desea mostrar a sus amigos.
dentro del ciclo WHILE en PHP que usarás para cargar los resultados, puedes filtrar los resulets haciendo una condición
while ... {
if (friendship[''user_id''] == $id) {
$f_id = friendship[''friend_id''] ; }
// other instructionS...
else {
$f_id = friendship[''user_id''] ; }
// other instructionS...
}
en este caso, cargará datos de las columnas de la tabla Bothe y luego filtrará cada vez la columna con la identificación del usuario y solo dejará la ID de su amigo, el filtro utilizado para no decirle al usuario que usted es amigo suyo.
lo siento, utilicé mysql para explicar el ejemplo