Laravel:如何定义这种关系

时间:2016-03-05 08:43:03

标签: laravel eloquent

我整天都对此感到困惑。 我有三个模型:AgentCustomerUser

AgentUser

Customer也是User,但属于Agent

User可以是AgentCustomer

现在我想知道这三种模型的雄辩关系。在此先感谢您的帮助。

3 个答案:

答案 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是(抽象)类,并且AgentCustomer都延伸User,那么它可能会更“干净”?然后你会有两种帐户。然后,您会在AgentCustomer之间建立一对多的关系(如果Customer可以有多个{{1},则可以是多对多关系}})。

缺点是,你不会只有一个列表而只有两个而Agent不能只是Agent,但连接更清晰,并且在数据库级别并且您不必检查应用程序级别上的关系(例如,当Customer Customer成为Agent时会发生什么情况,然后是Agent - &gt; Agent关系?)。

然后,您还可以更轻松地向AgentAgent添加额外字段,而不会影响另一个字段。

答案 2 :(得分:0)

您没有/不应该有3个模型,而是一个抽象类m <- melt(df, id.vars='var') m[m$value != 0, -3] 和2个派生类UserAgent。然后你的关系很直接:

Customer