Eu tive uma situação semelhante e Escopo da consulta junto com minha tabela dinâmica para uma relação de muitos. Na minha situação, o usuário tem vários grupos e preciso buscar esses dados junto com o objeto do usuário sem consulta extra ou sem JOINs.Consulte
Query scope
e um para muitos e muitos para muitos com pivô no Laravel Doc. Se você deseja buscar dados usando a tabela dinâmica, aqui está o exemplo
Modelo de usuário:
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',
];
}
No modelo de usuário acima, veja
return $this->belongsToMany('App\Group','user_groups', 'user_id', 'group_id');
, onde user_groups é minha tabela dinâmica que define o relacionamento entre usuários e grupo. group_id
e user_id
são os campos na tabela dinâmica. Agora buscando dados (no controlador) usando a arquitetura acima:
User::where(.....)->detail()->first();
onde
detail()
é meu escopo definido no modelo de usuário como scopeDetail
. Observação:scope
prefixo deve ser anexado. Isso lhe dará o usuário com todos os grupos que o usuário pertence em array, então sempre que você visualizar seus dados em JSON você poderá ver a estrutura da maneira correta. Usando o método acima, meu usuário objeto tem todos os grupos aos quais o usuário pertence.
Extras
Se o seu modelo de usuário (usuários) também estiver relacionado a outros modelos, você poderá incluir todos eles definindo o escopo na classe do 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
}
........
........