我整天都对此感到困惑。
我有三个模型:Agent
,Customer
和User
。
Agent
是User
。
Customer
也是User
,但属于Agent
。
User
可以是Agent
或Customer
。
现在我想知道这三种模型的雄辩关系。在此先感谢您的帮助。
答案 0 :(得分:0)
我能想到的最好的方法是使用多对多的多态关系。
由于用户既可以是代理也可以是客户,我们将创建用户表并创建另一个表,然后我们将其命名为可用表,这将有助于将用户映射到代理,客户或两者。
可用表将包含这些字段
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');
}
}
答案 1 :(得分:0)
如果User
是(抽象)类,并且Agent
和Customer
都延伸User
,那么它可能会更“干净”?然后你会有两种帐户。然后,您会在Agent
和Customer
之间建立一对多的关系(如果Customer
可以有多个{{1},则可以是多对多关系}})。
缺点是,你不会只有一个列表而只有两个而Agent
不能只是Agent
,但连接更清晰,并且在数据库级别并且您不必检查应用程序级别上的关系(例如,当Customer
Customer
成为Agent
时会发生什么情况,然后是Agent
- &gt; Agent
关系?)。
然后,您还可以更轻松地向Agent
或Agent
添加额外字段,而不会影响另一个字段。
答案 2 :(得分:0)
您没有/不应该有3个模型,而是一个抽象类m <- melt(df, id.vars='var')
m[m$value != 0, -3]
和2个派生类User
和Agent
。然后你的关系很直接:
Customer