繁体   English   中英

SQLSTATE[23000]:违反完整性约束:4025 CONSTRAINT

[英]SQLSTATE[23000]: Integrity constraint violation: 4025 CONSTRAINT

嘿,当我将数据从 laravel 插入到 MySQL 时出现问题,出现错误 SQLSTATE[23000]: Integrity constraint violation: 4025 CONSTRAINT

这是商店 controller

public function store(Request $request)
{
    // $faker = Faker::create('id_ID');
    $image = $request->file('Product_photo');
    $extension = $image->getClientOriginalExtension();
    $name = $request->Name;
    $file_name = $name.'.'.$extension;
    $image->move("images/listcar/", $file_name);
    DB::table('car')
    ->insert([
        //'id' => $faker->unique()->numberBetween($min = 0, $max = 200),
        'product_photo' => $file_name,
        'name' => $request->Name,
        'production_year' => $request->Production_year,
        'price' => $request->Price,
        'merk' => $request->Merk,
        'description' => $request->Description,
        'varian' => $request->Variant,
        'machine' =>$request->Machine,
        'transmision' => $request->Transmision,
        'wheel' => $request->Wheel,
    ]);
    return redirect('/admin');

这是我的刀片

<body>
<h1>Tambah Mobil</h1>
<div class="container">
    <form action="/car/add" method="post" enctype="multipart/form-data">
    {{ csrf_field() }}
    <th>Nama</th><br>
        <input type="text" name="Name" value=""><br/><br>
    <th>Tahun Produksi</th><br>
        <input type="text" name="Production_year" value=""><br/><br>
    <th>Harga</th><br>
        <input type="number" name="Price" value=""><br/><br>
    <th>Select Product Image</th><br>
        <input type="file" name="Product_photo" /><br/><br>
    <th>Merek</th><br>
        <input type="text" name="Merk" value=""><br/><br>
    <th>Deskripsi</th><br>
        <input type="textarea" name="Description" value=""><br/><br>
    <th>Varian</th><br>
        <input type="text" name="Variant" value=""><br/><br>
    <th>Mesin</th><br>
        <input type="text" name="Machine" value=""><br/><br>
    <th>Transmisi</th><br>
        <input type="text" name="Transmision" value=""><br/><br>
    <th>Penggerak Roda</th><br>
        <input type="text" name="Wheel" value=""><br/><br>
    <br>
        <input class="btn btn-primary" type="submit" value="Tambah Data Mobil">
    </form>
    <br>
    <br>
</div>

MySQL结构在此处输入图像描述

我真的不知道我哪里错了,所以请告诉我是否有错误的概念

更改 mysql 表上的排序规则 - utf8mb4_general_ci:)

检查您的 model $fillable fillable 数组。 确保将插入记录的所有列都是 $fillable 的一部分

我有同样的问题并解决了:

如果您将非 json 保存到 JSON 字段中,则会发生此错误,如下所示:

    $item = new WhatsAppWebhook($data);
    $item->save();
    return $item;

你需要编码

    $payload = array("payload"=>json_encode($data));
    $item = new WhatsAppWebhook($payload);
    $item->save();
    return $item;
$user_role = array(('role')=>json_encode($request['role']));
$user_role = implode(', ', $user_role);

我最近遇到了与 JSON 字段相关的 Laravel ‘constraint violation’ 错误。 日志没有透露,错误是间歇性的。 我花了一些时间,但幸运的是修复很容易。

长话短说

  • 问题:在 Laravel 的Model class 中,我将字段设置为受保护,然后提供了一个无效的默认值。
  • 解决方案:在 Laravel 中,使模型的 JSON 字段的默认值有效 JSON 编码字符串。 即使它们是空的{}

错误

当我第一次将代码部署到生产环境时,我看到了一个 HTTP-500 错误,这在我的本地测试中并没有出现:

[2022-09-27 03:54:27] local.ERROR: SQLSTATE[23000]: Integrity constraint violation: 
4025 CONSTRAINT `table.field3` failed for `database`.`table` (SQL: insert into `table` (`field1`, `field2`, `field3`
...
#0 /path/to/project/vendor/laravel/framework/src/Illuminate/Database/Connection.php(719): 
Illuminate\\Database\\Connection->runQueryCallback('insert into `ta...', Array, Object(Closure))

不是一个非常有启发性(双关语意)的日志条目,而且我无法在我的 vagrant 开发环境中重现该错误。 vagrant 盒子和生产环境之间的唯一区别是 MariaDB 是 10.9 版,而生产环境中是 10.7 版。

问题

事实证明,在 Laravel 迁移中字段类型为json()很重要。

数据库/迁移/2022_09_25_133630_create_model_table.php:

new class extends Migration
{
    public function up()
    {
        Schema::create('my_model', function (Blueprint $table) {
            $table->id();
            ...
            $table->json('field3');

我一直想知道为什么 Laravel 在创建 SQL 表后都减少到少数几个时,为什么 Laravel 在迁移中遇到这么多字段类型。 在本例中, longtext列是长文本(不可为空)。

在 Laravel 的Model class 中,我将字段设置为 guarded,然后提供了一个我认为合适的默认值。

应用程序/模型/my_model.php:

class my_model extends Model
{
    use HasFactory;

    /**
     * The attributes that are NOT mass assignable.
     *
     * @var string[]
     */
    protected $guarded = [
        'field3'
    ];

    /**
     * Default values for attributes.
     *
     * @var array
     */
    protected $attributes = [
        'field3' => "",
    ];

一定是MariaDB这两个版本的字段是如何存储的底层机制在这里凸显出来的? 出现错误是因为我作为默认值提供的空字符串不是有效的 JSON 编码,因此与 json() 的 Laravel 字段类型不兼容。 在我看来,它在 MariaDB 中不可为 null 的长文本列的上下文中是完全有效的。

解决方案

在 Laravel 中,使模型的 JSON 字段的默认值有效 JSON 编码字符串。

应用程序/模型/my_model.php:

class my_model extends Model
{
    use HasFactory;

    /**
     * The attributes that are NOT mass assignable.
     *
     * @var string[]
     */
    protected $guarded = [
        'field3'
    ];

    /**
     * Default values for attributes.
     *
     * @var array
     */
    protected $attributes = [
        'field3' => "{}",
    ];

如果某个字段不可为空且没有默认值而没有值,也可能会发生此错误。

要解决此问题,请在您的代码或偏头痛中添加默认值。

以下是将 email 字段更新为可空并将价格默认值设置为零的迁移示例:

<?php

Schema::table('users', function (Blueprint $table) {
    $table->string('email', 255)->nullable()->change();
    $table->integer('price')->default(0)->change();
});

https://laravel.com/docs/8.x/migrations#column-modifiers

我还发现问题的根源在于 json() 类型的字段的默认值错误。

在我的博客上写到: https://www.dfoley.ie/blog/laravel-constraint-violation-error-on-json-field

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM