with updateorcreate meaning espaƱol php orm laravel laravel-4

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