免责声明:我是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()
时,它会返回多对多的数据,而不是实际的用户。我希望它返回用户列表,而不是链接用户的数据列表。
我查看了文档,但无法弄清楚如何执行此操作。我必须以某种方式通过多对多,返回用户而不是多对多关系。
答案 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()
中添加了第二个参数来定义数据透视表