无法插入数据透视表
Posted
技术标签:
【中文标题】无法插入数据透视表【英文标题】:Can't insert into pivot table 【发布时间】:2021-06-22 23:13:34 【问题描述】:我的数据库中有一个数据透视表,它结合了用户和贷款。表格如下。
user_id
loan_id
amount
现在我有以下代码可以将数据插入数据库
$user = User::find(2);
$user->loans()->create([
// Some database insertion
]);
$user->loans()->attach(2, ['amount' => '500']);
我收到此错误...
Illuminate\Database\QueryException: SQLSTATE[HY000]: General error: 1364 Field 'amount' doesn't have a default value (SQL: insert into `loan_user` (`loan_id`, `user_id`) values (42, 2)) in file G:\Development\final-project\backend\vendor\laravel\framework\src\Illuminate\Database\Connection.php
我的贷款和用户有一个多对多的关系,我还有一个名为loan_user 的数据透视表。 我在这里做错了什么?
编辑
这是我的数据透视表的迁移
Schema::create('loan_user', static function (Blueprint $table)
$table->id();
$table->unsignedBigInteger('loan_id');
$table->unsignedBigInteger('user_id');
$table->integer('amount');
$table->timestamps();
);
重要的事情
我使该金额列可以为空。然后它没有抛出任何错误,但有时金额为 500,有时为空。我不知道发生了什么。
解决方案
我通过首先创建贷款然后将其附加到用户和枢轴金额来解决这个问题。像这样。
$loan = Loan::create([
// something
]);
$user->loan()->attach(['amount' => 500]);
【问题讨论】:
我的第一个问题,你为什么在数据透视表中使用amount
列?
多个用户可以在多个贷款中拥有多个金额。假设有五个用户参与了一笔指定金额的贷款,该用户可以是贷方或借方,但该用户也可能参与其他贷款。
【参考方案1】:
你必须这样使用
return $this->belongsToMany('App\Loan', 'amount')->withPivot('amount');
如果你一次插入多行,那么你必须像这样使用
$user->loans()->attach('2',['amount'=>500]);
For More details
【讨论】:
这里的问题是我的代码没有到达我附加的行,创建贷款时失败 您的数据透视表中有amount
列吗??【参考方案2】:
您正在尝试通过多对多关系创建记录,这就是它失败的原因。相反,您可以单独创建贷款并附加以下内容:
$loan = Loan::create([
// data
]);
$user->loans()->attach(
$loan, [
'amount' => 500,
]
);
另外,您的loans
关系应该如下所示:
public function loans(): BelongsToMany
return $this->belongsToMany(Loan::class)
->withPivot('amount')
->withTimestamps();
这将在查询时将数量添加到数据透视表中。
参考:https://laravel.com/docs/eloquent-relationships#attaching-detaching
【讨论】:
但是,我已经这样做了,它没有用。我的代码没有到达我附加的行。它在 $loan->create 行中失败。 哎呀,对不起,你是对的。我必须先插入贷款,然后将其附加到带有枢轴金额的用户。谢谢.... 是的,如果我没有早点说清楚,对不起。我已经更新了我的答案:)以上是关于无法插入数据透视表的主要内容,如果未能解决你的问题,请参考以下文章