В моем приложении три модели: User
, Product
а также Retailer
, Пользователь может быть опционально связан с одним Retailer
,
каждый Product
принадлежит одному User
и, возможно, один продавец.
Пользователи должны иметь доступ ко всем Product
принадлежащие им, а также все товары, принадлежащие розничному продавцу, с которым они связаны (если есть).
По сути, это означает, что мне нужно создать два отношения и каким-то образом объединить их.
public function products()
{
// Via column `user_id` in products table
return $this->hasMany('App\Product');
}
// And:
public function products()
{
// Via column `user_id` in products table
return $this->hasManyThrough('App\Product', 'App\Retailer');
}
Как я могу объединить эти два отношения в одно?
// User model
public function products()
{
return $this->hasMany('App\Product');
}
public function retailer()
{
return $this->belongsTo('App\Retailer');
}
// Product model
public function user()
{
return $this->belongsTo('App\User');
}
public function retailer()
{
return $this->belongsTo('App\Retailer');
}
// Retailer Model
public function products()
{
return $this->hasMany('App\Product');
}
public function users()
{
return $this->hasMany('App\User');
}
Использование:
// with one user
$user = User::find(1);
$retailerProducts = $user->retailer->products;
foreach( $retailerProducts as $product )
{
echo $product->id;
}// When getting multiple users, use eager loading to get all products in one query
$users = User::with('retailer.products')->get();
foreach( $users as $user )
{
foreach( $user->retailer->products as $product )
{
echo $product->id;
}
}
Других решений пока нет …