同様の状況で、クエリスコープ
1対多の関係のための私のピボットテーブルと一緒に。私の状況では、ユーザーには複数のグループがあり、追加のクエリやJOINを使用せずに、ユーザーオブジェクトとともにそれらのデータをフェッチする必要があります。Query scope
を参照してください。 1対多および多対多でLaravelDocをピボットします。
ピボットテーブルを使用してデータをフェッチする場合は、
ユーザーモデル:の例を次に示します。
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');
}
}
グループモデル:
class Group extends Model
{
protected $fillable = [
'dn', 'cn', 'description',
];
}
上記のユーザーモデルでは、return $this->belongsToMany('App\Group','user_groups', 'user_id', 'group_id');
を参照してください。 、ここで、user_groupsは、ユーザーとグループの関係を定義するピボットテーブルです。 group_id
およびuser_id
ピボットテーブルのフィールドです。
上記のアーキテクチャを使用して(コントローラーで)データをフェッチするようになりました:
User::where(.....)->detail()->first();
ここで、detail()
ユーザーモデルでscopeDetail
として定義されているスコープです 。注:scope
プレフィックスを付ける必要があります。これにより、ユーザーが属するすべてのグループの配列がユーザーに提供されるため、JSONでデータを表示するときはいつでも、適切な方法で構造を確認できます。
上記の方法を使用して、私のユーザー オブジェクトには、ユーザーが属するすべてのグループが含まれます。
追加
ユーザーモデル(users)が他のモデルにも関連している場合は、モデルクラスのスコープを次のように定義することでそれらすべてを含めることができます
............
//..............
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
}
........
........