Php 定义两个表上的本地键的Laravel belongsToMany关系
因此,belongToMany关系是一个多对多关系,因此需要一个透视表 例如,我们有一个Php 定义两个表上的本地键的Laravel belongsToMany关系,php,sql,database,laravel,laravel-4,Php,Sql,Database,Laravel,Laravel 4,因此,belongToMany关系是一个多对多关系,因此需要一个透视表 例如,我们有一个用户表、一个角色表和一个用户角色透视表 透视表有两列,user\u id,foo\u idfoo_id参考角色表中的id 为此,我们在用户雄辩模型中编写以下内容: return$this->belongtomany('Role','user\u roles','user\u id','foo\u id') 现在,它在users表中查找id字段,并将其与user\u roles表中的user\u id字段联接
用户
表、一个角色
表和一个用户角色
透视表
透视表有两列,user\u id
,foo\u id
foo_id
参考角色表中的id
为此,我们在用户
雄辩模型中编写以下内容:
return$this->belongtomany('Role','user\u roles','user\u id','foo\u id')代码>
现在,它在users
表中查找id
字段,并将其与user\u roles
表中的user\u id
字段联接
问题是我想指定一个不同的字段,而不是id
来加入users
表中。例如,我在用户表中有bar\u id
,我想用它作为local键
与user\u id
从laravel的文档来看,不清楚如何做到这一点。在其他关系中,如有许多
和属于
,我们可以指定本地键
和外键
,但出于某种原因,不能在这里指定
我希望用户表上的local键
是bar\u id
,而不仅仅是id
我如何才能做到这一点?这是最近添加的功能。我必须升级到4.1,因为我也在寻找这个
从:
在4.1中添加了$otherKey
和$relation
参数。使用$foreignKey
和$otherKey
参数可以指定关系两侧的键。更新:
从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
是用户
模型上的主键,所以用雄辩的方法无法做到这一点,因为belongTomany
使用$model->getKey()
获取该键
因此,您需要创建自定义关系扩展belongTomany
,以满足您的需要
您可以尝试的一个快速猜测:(未测试,但肯定无法与急切加载一起工作)
最好的方法是设置主键
class Table extends Eloquent {
protected $table = 'table_name';
protected $primaryKey = 'local_key';
BelongToMany允许定义将在数据透视表中存储che键的字段的名称,但该方法始终将主键值插入这些字段
你必须:
- 在方法下定义表和列
- 然后使用受保护的$primaryKey='local_key';您可以选择哪个值存储
我最近遇到了同样的问题,我需要一个关联的表,该表使用ID将两个不是主键的表链接在一起。基本上,我所做的是创建一个模型副本,对数据透视表进行建模,并将主键设置为我希望它使用的值。我尝试创建一个模型实例,设置主键,然后将其传递给关系,但Laravel不遵守我设置的主键(使用上面的->setPrimaryKey()方法)
制作模型的副本并设置主键感觉有点“黑客”,但最终它会正常工作,而且由于透视表模型通常非常小,我认为它不会在将来造成任何问题
希望在下一版本的Laravel中提供第三个关键选项,使您的链接更加具体。在Laravel 5.5及更高版本上
public function categories()
{
return $this->belongsToMany(Category::class,'service_categories','service_id','category_id', 'uuid', 'uuid');
}
从源代码:
public function belongsToMany($related, $table = null, $foreignPivotKey = null, $relatedPivotKey = null,
$parentKey = null, $relatedKey = null, $relation = null)
{}
这会影响其他关系吗?如果你指的是调整,那么不会。我想这只会影响到这个关系。这似乎在得到时起作用。但是当我附加时,它附加的是id,而不是我的desiredUserColumn
。如何修复?仅使用自定义关系类。该列是什么?为什么需要这样的功能?我正在导入数据,所有关系都是用另一个键设置的,除了“id”键。所以现在我需要确保这些关系正确处理。哪个L5?不在我的L5.4中。无法编辑,因此添加:Not L5。L5.5(或L5.6)。以前没有
public function categories()
{
return $this->belongsToMany(Category::class,'service_categories','service_id','category_id', 'uuid', 'uuid');
}
public function belongsToMany($related, $table = null, $foreignPivotKey = null, $relatedPivotKey = null,
$parentKey = null, $relatedKey = null, $relation = null)
{}