如何在Laravel

时间:2017-04-21 14:43:31

标签: php laravel-5 orm

免责声明:我是Laravel的新手,但有其他MVC框架的经验,例如Django

我有3个主表和2个多对多表。

用户可以是客户端和部门的一部分,并且对于用户所属的每个客户端,他们具有排名。客户也可以拥有多个部门,但部门只能是一个客户的一部分。

粗略地说,多对多(pivot?)表格如下所示:

client_users

- user_id
- client_id
- rank_id
department_users

- department_id
- user_id

所以在Laravel我有我的客户端模型:

class Client extends Model
{
    /**
    * Columns:
    * @property name = varchar(255)
    **/

    protected $table = 'clients';

    // Relationships
    public function departments() {
        return $this->hasMany('App\Models\Grouping\Department');
    }

    public function users() {
        return $this->hasMany('App\Models\Grouping\ClientUser');
    }
}

class ClientUser extends Model
{
    protected $table = 'client_users';
}

问题在于,当我执行$client->users()->get()时,它会返回多对多的数据,而不是实际的用户。我希望它返回用户列表,而不是链接用户的数据列表。

我查看了文档,但无法弄清楚如何执行此操作。我必须以某种方式通过多对多,返回用户而不是多对多关系。

1 个答案:

答案 0 :(得分:1)

您不必将枢轴定义为单独的模型。你可以,但你不必。

只要您使用命名约定,Laravel就会找出要使用的轴。

您正在寻找的是这样的事情(我不知道您的命名空间):

class Client extends Model
{
    public function departments()
    {
        return $this->hasMany(\App\Models\Grouping\Department::class); // 1:n
    }

    public function users()
    {
        return $this->belongsToMany(\App\Models\Grouping\User::class, 'client_users'); // will look for pivot client_users
    }
}


class Department extends Model
{
    public function client()
    {
        return $this->belongsTo(\App\Models\Grouping\Client::class); // inverse 1:n
    }

    public function users()
    {
        return $this->belongsToMany(\App\Models\Grouping\User::class, 'department_users'); // will look for pivot department_users
    }
}


class User extends Authenticatable
{
    public function clients()
    {
        return $this->belongsToMany(\App\Models\Grouping\Client::class, 'client_users'); // will look for pivot client_users
    }


    public function departments()
    {
        return $this->belongsToMany(\App\Models\Grouping\Department::class, 'department_users'); // will look for pivot department_users
    }
}

现在使用

$client->users;

将返回User对象的集合。

如果您需要来自枢轴的信息(例如:rank_id),您可以这样做:

    public function users()
    {
        return $this->belongsToMany(\App\Models\Grouping\User::class)
            ->withPivot('rank_id');
    }

编辑:

->belongsToMany()中添加了第二个参数来定义数据透视表