mysql 数据库状态[23000]:完整性约束冲突:4025约束条件

iqjalb3h  于 2022-10-31  发布在  Mysql
关注(0)|答案(5)|浏览(863)

嘿,我有问题,当我插入我的数据从laravel到MySQL的错误SQLSTATE[23000]:完整性约束冲突:4025约束条件
这里是商店管理员

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结构

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

rur96b6h

rur96b6h1#

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

euoag5mw

euoag5mw2#

请检查您的$fillable数组模型。确保要插入记录的所有列都是$fillable的一部分

u0sqgete

u0sqgete3#

我有同样的问题,并解决:
如果您将非json保存到JSON字段中,则会出现如下错误:

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

您需要编码

$payload = array("payload"=>json_encode($data));
    $item = new WhatsAppWebhook($payload);
    $item->save();
    return $item;
9rnv2umw

9rnv2umw4#

$user_role = array(('role')=>json_encode($request['role']));
$user_role = implode(', ', $user_role);
gjmwrych

gjmwrych5#

我最近遇到了一个与JSON字段相关的Laravel“违反约束”错误。日志没有显示,bug是间歇性的。这花了我一些时间,但幸运的是修复很容易。

TL;DR

  • 问题:在Laravel的Model类中,我将字段设置为保护,然后提供了无效的默认值。
  • 解决方案:在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 box和生产环境之间的唯一区别是MariaDB是10. 9版本,而生产环境中是10. 7版本。
问题所在
结果表明,Laravel偏移中的json()场类型具有显著性。

  • 数据库/迁移/2022_09_25_133630创建模型表. php:*
new class extends Migration
{
    public function up()
    {
        Schema::create('my_model', function (Blueprint $table) {
            $table->id();
            ...
            $table->json('field3');

我一直想知道为什么Laravel在迁移中要处理这么多的字段类型,而一旦创建了SQL表,这些字段类型就变得非常少了。在这个例子中,MariaDB列是longtext(不可空)。
在Laravel的Model类中,我已经将字段设置为受保护的,然后提供了一个我认为合适的默认值。

  • 应用程序/模型/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中不可为空的长文本列的上下文中是完全有效的。

解决方案

在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' => "{}",
    ];

相关问题