Laravel属于在两个表上定义本地键的ToMany关系

时间:2014-06-24 16:27:31

标签: php sql database laravel laravel-4

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

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

数据透视表有两列,user_idfoo_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的文档来看,目前尚不清楚如何做到这一点。在hasManybelongsTo等其他关系中,我们可以指定local keyforiegn key,但出于某种原因不在此处。

我希望用户表上的local keybar_id,而不仅仅是id

我该怎么做?

5 个答案:

答案 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,因为我也在寻找这个。

来自API documentation

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的下一个版本中提供的第三个关键选项,让您可以更加具体地了解链接。