首页 > 解决方案 > 如何覆盖使用 haruncpi/IdGenerator 格式化的 Laravel Eloquent 模型 ID

问题描述

我正在尝试格式化并在 Eloquent 模型 id ( OrderItem::$id) 前面加上一个字符串和当前年份,例如。P-2021-3958、P-2021-1234、P-2022-1443。

我找到并安装了haruncpi/laravel-id-generator,并根据其他各种 stackoverflow 答案对其进行了配置。

不幸的是,当将Field模型附加到相应的OrderItembelongsToMany 时,这会失败:

 $orderItem->fields()->attach(
                $field_id,
                ['value' => "somevalue"]);

抛出此异常:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`db`.`field_order_item`, CONSTRAINT `field_order_item_order_item_id_foreign` FOREIGN KEY (`order_item_id`) REFERENCES `order_items` (`id`)) (SQL: insert into `field_order_item` (`created_at`, `field_id`, `order_item_id`, `updated_at`, `value`) values (2021-04-07 14:20:57, 28, 0, 2021-04-07 14:20:57, saepe))

这是迁移的相关部分:

//order_items table
$table->string('id)->unique();

//fields table
$table->string('order_item_id');
$table->foreign('order_item_id')->references('id')->on('order_items');

这是OrderItem::boot()方法:

  parent::boot();

        self::creating(function ($model){
            $id = IdGenerator::generate( [
                'table'                  => 'order_items',
                'length'                 => '11',
                'prefix'                 => date( 'Y' ).'/',
                'reset_on_prefix_change' => false,

            ] );
            ray( $id );
            $model->id = $id;
            ray()->model($model);

        });

第一个ray调用正确输出了格式化的 id,第二个调用输出了 ID 设置为的模型int(2021)

标签: phplaraveleloquent

解决方案


推荐阅读