因此,belongsToMany关系是多对多关系,因此需要数据透视表
示例中,我们有一个users表,一个roles表和一个user_roles数据透视表。
users
roles
user_roles
枢轴表有两列,user_id,foo_id…foo_id指的是id在角色表。
user_id
foo_id
id
为此,我们在user雄辩的模型中编写了以下代码:
user
return $this->belongsToMany('Role', 'user_roles', 'user_id', 'foo_id');
现在,这个寻找一个id在外地users表,并与加入它user_id在该领域user_roles表。
问题是我想指定一个不同的字段,而不是id在users表中加入。例如bar_id,在用户表中我想用作local key与之联接的表user_id
bar_id
local key
从laravel的文档中,尚不清楚如何执行此操作。在诸如hasMany和belongsTo这样的其他关系中,由于某种原因,我们可以在此处指定local key,foriegn key但不能在此处指定。
hasMany
belongsTo
foriegn key
我希望local key用户表上的bar_id而不是id。
我怎样才能做到这一点?
更新:从 Laravel 5.5 开始,可以使用通用关系方法,如下面的@cyberfly所述:
public function categories() { return $this->belongsToMany( Category::class, 'service_categories', 'service_id', 'category_id', 'uuid', // new in 5.5 'uuid' // new in 5.5 ); }
供参考,以前的方法:
我认为这id是您User模型的主键,因此无法使用Eloquent方法执行此操作,因为belongsToMany它是$model->getKey()用来获取该键的。
User
belongsToMany
$model->getKey()
因此,您需要创建自定义的关系扩展来belongsToMany满足您的需求。
您可以尝试快速猜测一下:(未经测试,但肯定无法用于急切的加载中)
// User model protected function setPrimaryKey($key) { $this->primaryKey = $key; } public function roles() { $this->setPrimaryKey('desiredUserColumn'); $relation = $this->belongsToMany('Role', 'user_roles', 'user_id', 'foo_id'); $this->setPrimaryKey('id'); return $relation; }