如何解决Laravel:在实例化 Eloquent 模型时保存关系会引发此 SQL 错误:“违反完整性约束”
总结
- 背景和需求
- 最小的、可测试的和可执行的来源(带有测试说明)
- 实际结果和预期结果
- 我的尝试
- 问题
背景和需求
Eloquent 模型 GalleryImage
和 GalleryGroup
之间的关系是:GalleryImage * <-> 1 GalleryGroup
。我想保存 GalleryGroup
的实例,然后是 GalleryImage
的实例。
最小的、可测试的和可执行的源
测试说明
-
我想向您展示如何在您真正想做的情况下测试我的代码;-)。但是,我认为您实际上不需要进行测试。确实,代码非常简单。通过阅读,如果你比我更了解 Laravel,也许你会发现问题并能给我带来一些帮助。我让你阅读以下内容,但我想你会同意我的。
-
为
GalleryGroup
和GalleryImage
创建表(主题外)。要创建的字段和表的名称包含在以下来源中。 -
复制/粘贴 Eloquent 模型和实例化它们并尝试将它们保存在数据库中的脚本。
-
创建您选择的路径来运行脚本,然后运行脚本(即:访问网页或使用 REST 客户端)
Eloquent 模型
-- GalleryGroup.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class GalleryGroup extends Model
{
use HasFactory;
protected $primaryKey = 'group_id';
private $name;
public function images() {
return $this->hasMany(GalleryImage::class);
}
}
-- GalleryImage.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class GalleryImage extends Model
{
use HasFactory;
protected $primaryKey = 'image_id';
public function group() {
return $this->hasOne(GalleryGroup::class,'group_id','image_id');
}
}
关系的实例化和具体化
Eloquent 模型 GalleryGroup
被实例化并保存在 db 中;然后,Eloquent 模型 GalleryImage
被实例化并且应该保存在 db 中:
$img_group = new GalleryGroup();
$img_group->name = 'foobar';
$img_group->save();
$image = new GalleryImage();
var_dump($img_group->group_id); // It exists and it's not empty
$image->group()->save($img_group);
$image->save();
实际结果和预期结果
最后一行永远不会执行,因为此错误是在第 $image->group()->save($img_group);
行引发的:
Illuminate\Database\QueryException:SQLSTATE[23000]:违反完整性约束:1048 列“group_id”不能为空(SQL:更新 gallery_groups
集 group_id
= ?,gallery_groups
。 updated_at
= 2021-01-09 10:16:44 其中 group_id
= 24) 在文件 /var/www/html/api/vendor/laravel/framework/src/Illuminate/Database/Connection 中。 php 在线 671
我不明白为什么它会尝试更新组条目,我也不明白为什么 group_id
是 NULL
或为空,因为 $img_group
实际上有一个非空group_id
(参见:行var_dump($img_group->group_id);
)。
实际结果是:1)模型GalleryGroup
被正确实例化并正确保存在db中 2)模型GalleryImage
被正确实例化并且没有保存在db中,因为上面的SQL错误是提升。
预期结果是:1) 模型 GalleryGroup
正确实例化并正确保存在 db 中;2) 模型 GalleryImage
正确实例化并保存在 db 中。
我的尝试
我曾多次尝试 var_dump
多个变量,但没有找到任何有助于调试此问题的相关信息。
我已阅读并重新阅读文档 https://laravel.com/docs/8.x/eloquent-relationships#the-save-method 和 https://laravel.com/docs/8.x/eloquent#primary-keys,但没有找到任何有助于调试此问题的相关信息。
问题
为什么会出现此错误以及如何解决?
解决方法
其中一个关系必须是 belongsTo
,因为其中一个表具有与另一个表相关的外键。我假设 GalleryImage 属于 GalleryGroup:
GalleryGroup
images
hasMany GalleryImage
GalleryImage
gallery
belongsTo GalleryGroup
一旦这些设置正确,您应该能够这样做以保存关系:
$img_group->images()->save($image);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。