2016-03-05 74 views
0

我一直對此感到困惑。 所以我有三種型號:Agent,CustomerUserLaravel:如何定義這種關係

AgentUser

Customer也是User,但屬於Agent。可以是AgentCustomer

現在我想知道這三種模型的雄辯關係。先謝謝您的幫助。

回答

0

我能想到的最好的方法是使用多對多的多態關係。

由於用戶既可以是代理,也可以是客戶,我們將創建用戶表並創建另一個表,然後我們將其命名爲可用表,這將有助於將用戶映射到代理,客戶或兩者。

的userable表將這些領域

user_id - integer 
userable_id - integer 
userable_type - string 

的USER_ID將持有的用戶ID,userable_id將持有的任一種藥劑或客戶ID和userable_type擁有代理或Custmoer型號類別名稱

用戶模式

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class User extends Model 
{ 

    public function agents() 
    { 
     return $this->morphedByMany('App\Agent', 'userable'); 
    } 


    public function customers() 
    { 
     return $this->morphedByMany('App\Customer', 'userable'); 
    } 
}  

代理模型

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Agent extends Model 
{ 

    public function users() 
    { 
     return $this->morphToMany('App\User', 'userable'); 
    } 
} 

客戶型號

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Customer extends Model 
{ 

    public function users() 
    { 
     return $this->morphToMany('App\User', 'userable'); 
    } 
} 
0

也許這將是 「乾淨」 如果User是(抽象)類,都AgentCustomer延長User?那麼你會有兩種賬戶。然後,您將在AgentCustomer(或者多對多關係,如果Customer可以具有多於一個的Agent)之間具有一對多關係。

缺點是,你不會只有一個列表,但兩個和Agent不能只是成爲一個Customer,但連接更清晰,並在數據庫級別,你不必檢查應用程序級別上的關係(例如,當誰擁有Agent變成Agent時會發生什麼情況,是否有Agent->Agent關係?)。

然後,您還可以更容易地將額外的字段添加到AgentCustomer而不會影響另一個字段。

0

您不必/不應該有3個型號,但一個抽象類User和2派生類AgentCustomer。那麼你們的關係非常簡單:

// Agent extends User 
public function customers() 
{ 
    return $this->hasMany(Customer::class, 'agent_id'); 
} 

// Customer extends User 
public function agent() 
{ 
    return $this->belongsTo(Agent::class, 'agent_id'); 
}