Tuve una situación similar y Query Scope
junto con mi tabla dinámica para una relación de uno a muchos. En mi situación, el usuario tiene varios grupos y necesito obtener esos datos junto con el objeto del usuario sin consultas adicionales o sin JOIN. Consulte Query scope
y uno a muchos y muchos a muchos con pivote en Laravel Doc.
Si desea obtener datos mediante una tabla dinámica, este es el ejemplo
Modelo de usuario:
class User extends Authenticatable
{
use Notifiable;
protected $fillable = [
'name', 'email', 'username', 'password',
];
protected $hidden = [
'password', 'remember_token',
];
public function groups()
{
return $this->belongsToMany('App\Group', 'user_groups',
'user_id', 'group_id');
}
public function scopeDetail($query)
{
return $query->with('groups');
}
}
Modelo de grupo:
class Group extends Model
{
protected $fillable = [
'dn', 'cn', 'description',
];
}
En el modelo de usuario anterior, consulte return $this->belongsToMany('App\Group','user_groups', 'user_id', 'group_id');
, donde user_groups es mi tabla dinámica que define la relación entre los usuarios y el grupo. group_id
y user_id
son los campos en la tabla dinámica.
Ahora Obteniendo datos (en el controlador) usando la arquitectura anterior:
User::where(.....)->detail()->first();
donde detail()
es mi alcance definido en el modelo de Usuario como scopeDetail
. Nota:scope
se debe adjuntar el prefijo. Esto le dará al usuario todos los grupos a los que pertenece el usuario en una matriz, por lo que cada vez que vea sus datos en JSON, podrá ver la estructura de manera adecuada.
Usando el método anterior, mi usuario El objeto tiene todos los grupos a los que pertenece el usuario.
Extra
Si su modelo de usuario (usuarios) también está relacionado con otros modelos, puede incluirlos todos definiendo el alcance en la clase del modelo como
............
//..............
public function profile()
{
return $this->belongsToMany('App\Profile', 'user_id');
}
public function data1()
{
return $this->belongsToMany('App\Data1', 'user_id');
}
public function groups()
{
return $this->belongsToMany('App\Group', 'user_groups',
'user_id', 'group_id');
}
//Defining query scope................
public function scopeDetail($query)
{
return $query->with('groups','profile','data1');
//to fetch user with this scope use User::where(.....)->detail()->get(); notice there is not scope prefix while using the scope
}
........
........