Laravel:实例化口才模型时保存关系会导致此SQL错误:“违反完整性约束”

JarsOfJam-Scheduler

概要

  1. 上下文和需求
  2. 最少,可测试和可执行的资源(带有测试说明)
  3. 实际结果和预期结果
  4. 我尝试过的
  5. 问题

上下文和需求

既雄辩模型之间的关系GalleryImageGalleryGroup:是GalleryImage * <-> 1 GalleryGroup我要保存的实例GalleryGroup,然后是GalleryImage

最少,可测试和可执行的资源

测试说明

  • 我想向您展示在您确实想做的情况下如何测试我的代码;-)。但是,我认为您实际上不需要测试。确实,代码非常简单。通过阅读它,如果您对Laravel的了解不止于我,也许您会发现问题并能够为我提供一些帮助。我让您阅读以下内容,但我想您会同意我的看法。

  • GalleryGroupGalleryImage(不属于主题)创建表以下字段包含要创建的字段和表的名称。

  • 复制/粘贴Eloquent模型和实例化它们的脚本,然后尝试将其保存在DB中。

  • 创建您选择的路由来运行脚本,然后运行脚本(即:访问网页或使用REST客户端)

雄辩的模型

-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中;然后,GalleryImage实例化Eloquent模型,应将其保存在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'不能为null(SQL:update gallery_groupsset group_id=?,gallery_groupsupdated_at= 2021-01-09 10:16:44其中group_id= 24)第671行的var / www / html / api / vendor / laravel / framework / src / Illuminate / Database / Connection.php

我不明白为什么它试图更新组条目,我也不明白为什么group_id是isNULL或为空,因为$img_group实际上有一个非空的group_id参见: line 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-methodhttps://laravel.com/docs/8.x/eloquent#主键,但未找到任何相关信息来帮助调试此问题。

问题

为什么会引发此错误,以及如何解决该错误?

滞后箱

这些关系之一必须为a,belongsTo因为其中一个表具有与另一个表相关的外键。我假设GalleryImage属于GalleryGroup:

GalleryGroup
    images
        hasMany GalleryImage

GalleryImage
    gallery
        belongsTo GalleryGroup

一旦正确设置了这些,您就应该能够保存关系:

$img_group->images()->save($image);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

错误:违反完整性约束:加入 Laravel Eloquent 时出现 1052

laravel违反完整性约束

违反完整性约束:1452 laravel

完整性约束违反laravel 9

使用Laravel ORM抽象保存新的非空关系,而不会违反数据库完整性约束

使用ForeignKeys发布模型会导致完整性错误

Laravel:多态关系-违反完整性约束:1048列'likeable_id'不能为空

Laravel 5.6 中的 SQL 完整性约束错误

Laravel保存时如何验证模型ID的完整性

JPA中的参照完整性约束违反错误

违反完整性约束:列不能为空错误

当值不为null时,违反完整性约束

Yii2:自定义违反完整性约束时的错误消息

Laravel - 违反完整性约束:1062 重复条目

laravel中违反完整性约束的问题

Laravel验证器-违反完整性约束

Laravel aimeos - 违反完整性约束问题

Laravel 5.8 SQLSTATE[23000]:违反完整性约束:1048

SQL错误:违反完整性约束:外键没有父级

为什么这个 SQL/DDL 违反了错误的完整性约束?

违反完整性约束-空MySQL

Laravel 7错误消息:'SQLSTATE [23000]:违反完整性约束:19 NOT NULL约束失败:profiles.url

我如何解决此错误:SQLSTATE [23000]:违反完整性约束:1062键“ PRIMARY”的条目“ 30”重复

Laravel违反完整性约束:1048在多对多关系中,列“ submitform_id”不能为空

违反完整性约束:1048列'user_id'不能为null分配角色时发生错误(Laravel 5.3)

Laravel雄辩的创建方法导致完整性约束违规

Laravel 错误:SQLSTATE[23000]:违反完整性约束:1062 重复条目(仅当作为 artisan 命令运行时)

ORA-02292:违反完整性约束-在ORACLE SQL Developer中创建过程时找到子记录?

Laravel 5:SQLSTATE [23000]:违反完整性约束,外键约束失败