2016-04-14 16 views
10

Trong ứng dụng Laravel của tôi, tôi có các lớp sau:HasManyThrough với các mối quan hệ đa hình và nhiều-nhiều

class Product extends Model 
{ 
    public function extended() 
    { 
     return $this->morphTo(); 
    } 

    public function users { 
     return $this->belongsToMany('App\User', 'products_users', 'product_id'); 
    } 
} 

class Foo extends Model 
{ 
    public function product() 
    { 
     return $this->morphOne('App\Product', 'extended'); 
    } 
    public function bars() 
    { 
     return $this->hasMany('App\Bar'); 
    } 
} 

class Bar extends Model 
{ 
    public function product() 
    { 
     return $this->morphOne('App\Product', 'extended'); 
    } 

    public function foo() 
    { 
     return $this->belongsTo('App\Foo'); 
    } 
} 

class User extends Model 
{ 
    public function products() 
    { 
     return $this->belongsToMany('App\Product', 'products_users', 'user_id'); 
    } 
} 

tôi có thể dễ dàng có được những người dùng của một đối tượng thanh sử dụng Bar::find(1)->product->users và tôi cũng có thể nhận được những chấn song của một người dùng với User::find(1)->products.

Làm cách nào để có được người dùng của tất cả các thanh thuộc về một foo cụ thể? Tức là, Foo::find(1)->users sẽ trả về tất cả người dùng có các thanh thuộc về Foo với id 1. Về cơ bản là hasManyThrough với các mối quan hệ đa hình và nhiều-nhiều.

Trả lời

2

Hãy thử một cái gì đó như thế này:

public function users() 
    { 
     $Foo = static::with(['bars', 'bars.products', 'bars.product.users'])->get(); 
     return collect(array_flatten(array_pluck($Foo, 'bars.*.product.users'))); 
    } 

này nên công việc cho bạn (mã đã được thử nghiệm, nhưng không chống lại cấu trúc chính xác giống như thiết lập của bạn). Dòng đầu tiên sẽ trả về tất cả người dùng lồng nhau sâu sắc thông qua các mối quan hệ. Dòng thứ hai sẽ rút ra những người sử dụng, san bằng chúng thành một mảng, sau đó biến đổi mảng thành một bộ sưu tập.

+0

Điều này dường như bao gồm người dùng không liên quan đến Foo –

+0

sử dụng câu lệnh 'find' thay vì câu lệnh' get', sau đó: '$ Foo = static :: with (['bars', 'bars. products ',' bars.product.users ']) -> find ($ this-> id); '(giả sử khóa chính của bạn là' id') –

Các vấn đề liên quan