Laravel 5.8使用自定义列名称作为数据透视表的多对多关系

时间:2019-05-09 07:45:13

标签: mysql laravel many-to-many pivot-table laravel-5.8

我有两个表user_detailslocation如下:

user_details
    user_id (INTEGER PRIMARY KEY)
    ......

location
    id (INTEGER UNSIGNED PRIMARY KEY)
    ......

这两个表彼此之间可能存在许多关联。现在,我正在使用如下所示的数据透视表location_user_details

location_user_details
    id (INTEGER UNSIGNED PRIMARY KEY),
    user_id (INTEGER FOREIGN KEY REFERENCES use_details.user_id)
    location_id (INTEGER FOREIGN KEY REFERENCES location.id)
    type (VARCHAR)

模型UserDetails的关系代码如下:

class UserDetails extends Model
{
    protected $primaryKey = 'user_id';
    ........
    public function location(){
        return $this->belongsToMany(Location::class, 'location_user_details', 'user_id', 'id')->withPivot('type');
    }
}

模型Location的关系代码如下:

class Location extends Model
{
    ......
    public function userDetails(){
        return $this->belongsToMany(UserDetails::class, 'location_user_details', 'id', 'user_id')->withPivot('type');
    }
}

现在在我的控制器中,通过以下代码保存UserDetailsLocation对象后,我将创建关系:

$userDetails->location()->attach($location->id, ['type'=>'HEADQUARTER']);

当代码到达执行的这一行时,出现以下异常:

  

SQLSTATE [HY000]:常规错误:1364字段'location_id'没有默认值(SQL:插入location_user_detailsidtype,{{1} })值(1,HEADQUARTER,0))

我想指出正在发生的两件事。

  1. “位置”字段未进入查询以插入数据。
  2. user_id的值为user_id,当将数据插入到0表中时,该值应大于0

现在让我在这里提到,当我进入数据库在user_detailslocation表中查找数据时,我发现所有数据都已插入。

现在我的问题是这段代码可能出了什么问题?

2 个答案:

答案 0 :(得分:0)

问题可能出在变量 $ location 中,但在创建变量时未显示。确保它是位置对象

答案 1 :(得分:0)

好吧,我终于找到了问题所在。关于此主题的文档很少。实际上,这取决于使用函数belongsToManybelongsToMany函数最多可使用7个参数。到目前为止,我可以解码前四个参数。

第一个参数采用相关模型的类。

第二个参数采用数据库中数据透视表的名称。

第三个参数采用数据透视表中列的名称,该列引用了调用belongsToMany的模型。

第四个参数采用数据透视表中引用相关模型的列的名称。

因此,模型location中函数UserDetails的代码如下:

public function location(){
    return $this->belongsToMany(Location::class, 'location_user_details', 'user_id', 'location_id')->withPivot('type');
}

模型userDetails中的函数Location的代码如下:

public function userDetails(){
    return $this->belongsToMany(UserDetails::class, 'location_user_details', 'location_id', 'user_id')->withPivot('type');
}

我希望这对其他人有帮助。