example conectar con php mysql database laravel eloquent

php - example - conectar laravel con mongodb



¿Cómo simplificar este código PHP Laravel a una consulta Eloquent? (6)

Supongo que todo esto debería estar en una consulta para evitar datos duplicados en la base de datos. ¿Es esto correcto?

¿Cómo simplifico este código en una consulta Eloquent?

$user = User::where( ''id'', ''='', $otherID )->first(); if( $user != null ) { if( $user->requestReceived() ) accept_friend( $otherID ); else if( !$user->requestSent() ) { $friend = new Friend; $friend->user_1= $myID; $friend->user_2 = $otherID; $friend->accepted = 0; $friend->save(); } }


Supongo que todo esto debería estar en una consulta para evitar datos duplicados en la base de datos. ¿Es esto correcto?

No es correcto. Evita la duplicación colocando restricciones unique en el nivel de la base de datos.

No hay literalmente nada que puedas hacer en PHP o en cualquier otro idioma, eso evitará duplicados, si no tienes claves únicas en tu (s) mesa (s). Ese es un hecho simple, y si alguien te dice algo diferente, esa persona está descaradamente equivocada. Puedo explicar por qué, pero la explicación sería larga, así que la omitiré.

Su código debe ser bastante simple, solo inserte los datos. Dado que no está exactamente claro cómo se maneja la singularidad (parece ser user_2, accepted , pero hay un caso de ventaja), sin un poco más de datos que usted, no es posible sugerir una solución completa.

Siempre puedes ignorar lo que escribí e intentar ir con las soluciones sugeridas, pero fallarán miserablemente y terminarás con duplicados.


Asumo que "amigos" aquí representa una relación de muchos a muchos entre los usuarios. Aparentemente las solicitudes de amistad de un usuario ( myID ) a otro ( otherId ).

Puedes representarlo con Eloquent como:

class User extends Model { //... public function friends() { return $this->belongsToMany(User::class, ''friends'', ''myId'', ''otherId'')->withPivot(''accepted''); } }

Es decir, no hay necesidad de modelo de Friend .

Entonces, creo que esto es equivalente a lo que quiere lograr (de lo contrario, actualice con una aclaración):

$me = User::find($myId); $me->friends()->syncWithoutDetaching([$otherId => [''accepted'' => 0]]);

( accepted 0 o 1, de acuerdo a su lógica de negocio).

Este método de sync evita inserciones duplicadas y actualiza o crea cualquier fila para el par dado de "myId - otherId". Puede establecer cualquier número de campos adicionales en la tabla dinámica con este método.

Sin embargo, estoy de acuerdo con @Mjh acerca de establecer restricciones únicas también en el nivel de la base de datos.


Para este tipo de problema, en primer lugar, debe disfrutar del código y la base de datos si está trabajando en laravel. Para esto primero creará una relación entre el friend mesa y el user en la base de datos, así como en los Modelos. También tienes que usar unique en la base de datos.

$data= array(''accepted'' => 0); User::find($otherID)->friends()->updateOrCreate([''user_id'', $otherID], $data));

Esta es la consulta que puede trabajar con esto. También puede pasar varias condiciones aquí. Gracias


Puede usar los métodos firstOrCreate / firstOrNew ( https://laravel.com/docs/5.3/eloquent )

Ejemplo (de documentos):

// Retrieve the flight by the attributes, or create it if it doesn''t exist... $flight = App/Flight::firstOrCreate([''name'' => ''Flight 10'']); // Retrieve the flight by the attributes, or instantiate a new instance... $flight = App/Flight::firstOrNew([''name'' => ''Flight 10'']);


Yo diría que si hay una relación entre User y Friend , simplemente puede emplear la relación modelo de Laravel , como:

$status = User::find($id)->friends()->updateOrCreate([''user_id'' => $id], $attributes_to_update));

Eso es lo que haría para garantizar que los nuevos datos se actualicen o se cree uno nuevo.

PS: He usado updateOrCreate () en Laravel 5.2. * Solamente. Y también sería bueno hacer un poco de verificación de la existencia del usuario antes de actualizar, de lo contrario se podrían lanzar algunos errores nulos.

ACTUALIZAR

No estoy seguro de qué hacer. ¿Podrías explicar un poco más lo que debo hacer? ¿Qué hay de $ attributes_to_update?

Bueno. Dependiendo de qué campos en la tabla de amigos marque a los dos amigos, ahora use su ejemplo user_1 y user_2 . Por el ejemplo que di, el $attributes_to_update sería (asumiendo que otro otherID es la otherID del nuevo amigo):

$attributes_to_update = [''user_2'' => otherID, ''accepted'' => 0 ];

Si su relación entre el User y el Friend se establece correctamente, entonces el user_1 ya estaría incluido en la inserción.

Además, en esta función updateOrCreate:

updateOrCreate($attributes_to_check, $attributes_to_update);

$attributes_to_check significaría aquellos campos que desea verificar si ya existen antes de crear / actualizar uno nuevo, así que si quiero asegurarme, la verificación se realiza cuando se accepted 0 luego puedo pasar ambos, diga `[''usuario_1'' => 1 , ''aceptado'' => 0]

Espero que esto sea más claro ahora.


use `firstOrCreate ''que hará lo mismo que hizo manualmente.

Definición de FirstOrCreate copiada del Manual de Laravel.

El método firstOrCreate intentará localizar un registro de base de datos utilizando los pares de columna / valor dados. Si el modelo no se puede encontrar en la base de datos, se insertará un registro con los atributos dados.

Así que de acuerdo a eso deberías intentar:

$user = User::where( ''id'', ''='', $otherID )->first(); $friend=Friend::firstOrCreate([''user_id'' => $myId], [''user_2'' => $otherId]);

Verificará con ambas identificaciones si no existen y luego creará un registro en la tabla de amigos.