我有两个表user_details
和location
如下:
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');
}
}
现在在我的控制器中,通过以下代码保存UserDetails
和Location
对象后,我将创建关系:
$userDetails->location()->attach($location->id, ['type'=>'HEADQUARTER']);
当代码到达执行的这一行时,出现以下异常:
SQLSTATE [HY000]:常规错误:1364字段'location_id'没有默认值(SQL:插入
location_user_details
(id
,type
,{{1} })值(1,HEADQUARTER,0))
我想指出正在发生的两件事。
user_id
的值为user_id
,当将数据插入到0
表中时,该值应大于0
。现在让我在这里提到,当我进入数据库在user_details
和location
表中查找数据时,我发现所有数据都已插入。
现在我的问题是这段代码可能出了什么问题?
答案 0 :(得分:0)
问题可能出在变量 $ location 中,但在创建变量时未显示。确保它是位置对象
答案 1 :(得分:0)
好吧,我终于找到了问题所在。关于此主题的文档很少。实际上,这取决于使用函数belongsToMany
。 belongsToMany
函数最多可使用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');
}
我希望这对其他人有帮助。