所以belongsToMany关系是多对多关系,因此需要一个数据透视表
示例我们有一个users
表和一个roles
表以及一个user_roles
数据透视表。
数据透视表有两列,user_id
,foo_id
... foo_id
引用角色表中的id
。
为此,我们在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
从laravel的文档来看,目前尚不清楚如何做到这一点。在hasMany
和belongsTo
等其他关系中,我们可以指定local key
和foriegn key
,但出于某种原因不在此处。
我希望用户表上的local key
为bar_id
,而不仅仅是id
。
我该怎么做?
答案 0 :(得分:16)
更新: 从 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()
来获取该值键。
因此,您需要创建扩展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;
}
答案 1 :(得分:1)
这是最近添加的功能。我不得不升级到4.1,因为我也在寻找这个。
public BelongsToMany belongsToMany(string $related, string $table = null, string $foreignKey = null, string $otherKey = null, string $relation = null)
4.1中添加了$otherKey
和$relation
参数。使用$foreignKey
和$otherKey
参数可以指定关系两侧的键。
答案 2 :(得分:0)
最好的方法是设置主键。
class Table extends Eloquent {
protected $table = 'table_name';
protected $primaryKey = 'local_key';
答案 3 :(得分:0)
belongsToMany 允许在数据透视表中定义要存储che键的字段的名称,但方法总是插入主键强>这些领域的价值观。
你必须:
在方法 belongsToMany 中定义表格和列;
然后使用受保护的 $ primaryKey ='local_key';你可以选择哪个值存储。
答案 4 :(得分:0)
我最近遇到了同样的问题,我需要有一个关联表,使用ID将两个表连接在一起,而不是主键。基本上我所做的是创建我的模型的副本,该模型对数据透视表进行建模并将主键设置为我希望它使用的值。我尝试创建一个模型实例,设置主键然后将其传递给关系,但Laravel不尊重我设置的主键(使用上面的 - > setPrimaryKey()方法)。
制作模型的副本并设置主键感觉有点' hackish'但最终它的工作原理应该如此,而且由于Pivot表模型通常非常小,所以我不会发现它会在将来造成任何问题。
很想看到Laravel的下一个版本中提供的第三个关键选项,让您可以更加具体地了解链接。