Ik had een vergelijkbare situatie en ik Query Scope
samen met mijn draaitabel voor een-op-veel-relatie. In mijn situatie heeft de gebruiker meerdere groepen en ik moet die gegevens samen met het gebruikersobject ophalen zonder extra query of zonder JOINs.Zie Query scope
en een voor veel en veel voor veel met pivot op Laravel Doc.
Als u gegevens wilt ophalen met een draaitabel, volgt hier het voorbeeld
Gebruikersmodel:
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');
}
}
Groepsmodel:
class Group extends Model
{
protected $fillable = [
'dn', 'cn', 'description',
];
}
In bovenstaand gebruikersmodel, zie return $this->belongsToMany('App\Group','user_groups', 'user_id', 'group_id');
, waarbij user_groups mijn draaitabel is die de relatie tussen gebruikers en groep definieert. group_id
en user_id
zijn de velden in de draaitabel.
Nu gegevens ophalen (op controller) met behulp van bovenstaande architectuur:
User::where(.....)->detail()->first();
waar detail()
is mijn bereik gedefinieerd in het gebruikersmodel als scopeDetail
. Opmerking:scope
voorvoegsel moet worden toegevoegd. Dit geeft u de gebruiker met alle groepen waartoe de gebruiker behoort in een array, dus wanneer u uw gegevens in JSON bekijkt, kunt u de structuur op de juiste manier zien.
Met behulp van bovenstaande methode, mijn gebruiker object heeft alle groepen waartoe de gebruiker behoort.
Extra
Als uw gebruikersmodel (gebruikers) ook gerelateerd is aan andere modellen, kunt u deze allemaal opnemen door het bereik op de modelklasse te definiëren als
............
//..............
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
}
........
........