我一直对此感到困惑。 所以我有三种型号:Agent
,Customer
和User
。Laravel:如何定义这种关系
Agent
是User
。
Customer
也是User
,但属于Agent
。可以是Agent
或Customer
。
现在我想知道这三种模型的雄辩关系。先谢谢您的帮助。
我一直对此感到困惑。 所以我有三种型号:Agent
,Customer
和User
。Laravel:如何定义这种关系
Agent
是User
。
Customer
也是User
,但属于Agent
。可以是Agent
或Customer
。
现在我想知道这三种模型的雄辩关系。先谢谢您的帮助。
我能想到的最好的方法是使用多对多的多态关系。
由于用户既可以是代理,也可以是客户,我们将创建用户表并创建另一个表,然后我们将其命名为可用表,这将有助于将用户映射到代理,客户或两者。
的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');
}
}
也许这将是 “干净” 如果User
是(抽象)类,都Agent
和Customer
延长User
?那么你会有两种账户。然后,您将在Agent
和Customer
(或者多对多关系,如果Customer
可以具有多于一个的Agent
)之间具有一对多关系。
缺点是,你不会只有一个列表,但两个和Agent
不能只是成为一个Customer
,但连接更清晰,并在数据库级别,你不必检查应用程序级别上的关系(例如,当谁拥有Agent
变成Agent
时会发生什么情况,是否有Agent
->Agent
关系?)。
然后,您还可以更容易地将额外的字段添加到Agent
或Customer
而不会影响另一个字段。
您不必/不应该有3个型号,但一个抽象类User
和2派生类Agent
和Customer
。那么你们的关系非常简单:
// 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');
}