2016-03-03 51 views
0

在我的應用程序中有三個模型:UserProductRetailer。用戶可以選擇與一個Retailer關聯。Laravel將多個關係統一爲一個

每個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'); 
} 

我怎麼能夠將這兩個關係統一成一個?

+0

是零售商只是一種特殊類型的用戶?意思是說一個普通用戶存儲更多的細節,或者是完全不同的東西? – Bogdan

+0

@Bogdan「零售商」模型是公司。多個用戶可以與同一個零售商相關聯(例如,所有爲該公司工作)。用戶通過'users'表中的'retailer_id'列與零售商關聯。 – Padarom

+0

從產品到零售商的連接如何?因爲你說用戶有retailer_id,而產品有user_id。所以這兩種關係都可以直接面向用戶,那麼產品如何屬於零售商? – blablabla

回答

1
// 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; 
    } 
}