2016-03-05 90 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'); 
}