Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Junção de pivô do Laravel 5.5 para obter valores de pivô com o resultado principal do MySQL


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
    }
........
........