admin

Laravel includesToMany关系在两个表上都定义了本地键

sql

因此,belongsToMany关系是多对多关系,因此需要数据透视表

示例中,我们有一个users表,一个roles表和一个user_roles数据透视表。

枢轴表有两列,user_idfoo_idfoo_id指的是id在角色表。

为此,我们在user雄辩的模型中编写了以下代码:

return $this->belongsToMany('Role', 'user_roles', 'user_id', 'foo_id');

现在,这个寻找一个id在外地users表,并与加入它user_id在该领域user_roles表。

问题是我想指定一个不同的字段,而不是idusers表中加入。例如bar_id,在用户表中我想用作local key与之联接的表user_id

从laravel的文档中,尚不清楚如何执行此操作。在诸如hasManybelongsTo这样的其他关系中,由于某种原因,我们可以在此处指定local keyforiegn key但不能在此处指定。

我希望local key用户表上的bar_id而不是id

我怎样才能做到这一点?


阅读 146

收藏
2021-05-10

共1个答案

admin

更新:从 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;
}
2021-05-10