Php 定义两个表上的本地键的Laravel belongsToMany关系

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字段联接

因此,belongToMany关系是一个多对多关系,因此需要一个透视表

例如,我们有一个
用户
表、一个
角色
表和一个
用户角色
透视表

透视表有两列,
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)
    {}