Позвольте мне предисловие к этому сообщению, я не могу изменить метод вставки первичного ключа. Это разрабатывается на унаследованной системе, и я не имею никакого контроля над методом получения первичного ключа, я просто должен иметь с ним дело.
Я обнаружил, что Laravel не будет обновлять первичный ключ коллекции при использовании метода create с помощью наблюдателя, который вставляет значение первичного ключа.
Вот мой сценарий (я сократил модели и файлы для места):
файл миграции:
Schema::create('forms_maps', function (Blueprint $table) {
$table->integer('id')->unsigned();
$table->string('name');
});
ModelObserver.php:
public function creating(Model $model)
{
$countername = strtolower(class_basename(get_class($model))).'s_id';
$model->id = tap(\App\Models\OCounter::where('countername',$countername)->first())->increment('counterval')->fresh()->counterval;
Log::debug("Creating ". strtolower(class_basename(get_class($model))) . ": " . $model);
}
DatabaseSeeder.php:
$accountApp = \App\Models\FormsMap::create(['name' => 'Account Application']);
Log::debug("Created formsmap: " . $accountApp);
Выходной журнал:
Creating formsmap: {"name":"Account Application","id":84}
Created formsmap: {"name":"Account Application","id":0}
Как видно из журнала, когда запись создается с помощью метода create внутри наблюдателя, я получаю правильный идентификатор; однако это значение не передается обратно в коллекцию в DatabaseSeeder. Я смотрю на это неправильно? Должен ли я использовать что-то еще, чтобы вставить значения в таблицы? Я не хочу вставлять это значение вручную / в строке, потому что каждая модель должна вводить эту информацию.
Спасибо!