Acceder Registrarme

Duda sobre consultas relacionadas en el ORM Eloquent de Laravel


Por: Felipe Mansilla Publicado el: 2016-07-14 20:51:48 Pregunta abierta

Hola comunidad, espero que estén muy bien, antes que todo les diré que busque en muchas partes, nunca pregunto nada pero esta es la ocasión que lo amerita.

- games
id
name (string)

- users (lo mismo que laravel)
id
email
password
etc

- privileges
id
name (string)

- game_user (relacion muchos a muchos con user y game
id
user_id
game_id

-privilege_users (aca es donde tengo problemas, te comento más abajo)
id
game_user_id
privilege_id

Tengo mis tablas:Todo bien con las primeras tablas, ejemplo un usuario puede tener muchos juegos y muchos juegos pueden pertenecer a varios usuarios. Eso lo tengo listo, muy fácil en Eloquent. Pero ahora a partir de la tabla game_user, es decir del juego que tiene el usuario quiero asignar los privilegios para dicho juego, es aqui donde no se como hacer. Ejemplo en el primer caso obtengo

$user = new App\Models\User();
$user->find(1)->games //Aca obtengo los juegos del usuario

Ahora si quisiera obtener los privilegios que tiene dicho usuario en ese juego, no sé como lo haría pero tipo
$user->find(1)->games[0]->privileges

Intenté de muchas formas, pero realmente no sé como relacionarlos, sé que el modelo de la bd está correcto.

Espero sus comentarios por favor

Saludos



Laravel

Usuario de (Perú)

Hola Felipe, lo que puedes hacer para este caso es usar la propiedad with sobre la consulta de Eloquent lo cual te trae los registros con los joins que requieras; entonces... aquí te pongo un ejemplo.

$user = new App\Models\User();

$tUser=$user::with('game_user', 'games', 'privilege_users', 'privileges')->whereRaw('id=?', [1])->first();

Ten en cuenta que supongo que hiciste bien las relaciones en los modelos de Eloquent, este código no lo puedo probar por el hecho que me presentas el ejemplo y necesitaria todo el flujo obvimente; entonces, pruébalo y cuéntame que pasa.

Esto debería bastar, si salta errores, revisa las relaciones de tu modelo, lo cual en realidad confío en que lo hayas hecho bien.

Espero te sirva, Saludos.

  • 2016-07-14 21:08:49
  • Me gusta(0)
Usuario de (Perú)

Recuerda que para recorrer los registros, tienes que hacerlo a través de las tablas intermedias, ya sea en bucles o de la mejor forma que sea según se te presente el caso. Para que veas mejor la estructura de los registros tal cual lo carga en el array resultante, puedes imprimir la variable donde se almacena con la función var_dump de la siguiente maner.

var_dump($tUser);

donde esto te mostrará toda la estructura del objeto.

  • 2016-07-14 21:11:34
  • Me gusta(0)
Usuario de (No especificado)
BadMethodCallException with message 'Call to undefined method Illuminate\Database\Query\Builder::game_user()'

Ese error tengo

  • 2016-07-14 21:16:51
  • Me gusta(0)
Usuario de (Perú)

Al parecer no hiciste las relaciones... así como creas las relaciones en las tablas de SqlServer o MySql también debes crear las relaciones para cada modelo en eloquent.

Como ejemplo te dejo esta clase donde se relacionan algunos modelos.

<?php
class TUsuario extends Eloquent
{
	protected $table='TUsuario';
	protected $primaryKey='codigoPersonal';

	public function tPersonal()
	{
		return $this->belongsTo('TPersonal', 'codigoPersonal');
	}

	public function tReciboVenta()
	{
		return $this->hasMany('TReciboVenta', 'codigoPersonal');
	}
}
?>

donde cada función de la clase es la relación con la tabla en la base de datos, claro, a través de las otras clases "Modelos" de Eloquent.

belongsTo para relación con el padre del modelo actual y hasMany para la relación de los hijos del modelo actual. En este caso sólo es el modelo usuario con la relación de uno a muchos hacia el modelo reciboventa y usuario con personal siendo este último el padre.

Recuerda que debes hacer este tipo de relaciones para cada relación física en tu base de datos a través de los modelos del ORM.

  • 2016-07-14 21:22:57
  • Me gusta(0)
Usuario de (Perú)

Corrección en la consulta, me equivoque una parte... prueba con eso.

$user = new App\Models\User();

$tUser=$user::with('game_user.games', 'privilege_users.privileges')->whereRaw('id=?', [1])->first();
  • 2016-07-15 01:16:09
  • Me gusta(0)

  • Debes estar logueado para realizar comentarios