Laravel устанавливает значение добавочного идентификатора при заполнении таблицы

Я пытаюсь заполнить таблицу MySql, используя класс сеялки Laravel. Проблема в том, что он не присваивает id поле (которое является инкрементным) значением, как я установил. В классе сеялки я получил:

public function run()
{

Patropi\Entidade::create([
'id' => '0',
'nome' => 'entidade 0',
'cpfcnpj' => '12345678901'
]);

Patropi\Fornecedor::create([
'id' => '0',
'prioridade' => '0'
]);
}

В базе данных Fornecedor идентификатор таблицы является внешним ключом, который ссылается на Entidade id, поэтому я хочу иметь одинаковый идентификатор на обоих. Проблема в том, когда он вставляет на Entidade он не ставит его как id = 0, но вместо этого он дает значение последнего инкремента + 1. Как заставить laravel вместо этого вставить 0? Заранее спасибо.

0

Решение

хранения NULL или же 0 в поле автоинкремента есть один из триггеров для назначения следующего инкрементного значения.

Из документов MySQL:

Вы также можете явно присвоить 0 столбцу для генерации порядковых номеров.

Если вы хотите отключить эту функцию, вы можете включить режим NO_AUTO_VALUE_ON_ZERO sql. Это изменит MySQL, так что только назначение NULL назначит следующее инкрементное значение и позволит вам сохранить 0 в поле. Из документов:

NO_AUTO_VALUE_ON_ZERO влияет на обработку столбцов AUTO_INCREMENT. Обычно вы генерируете следующий порядковый номер для столбца, вставляя в него либо NULL, либо 0. NO_AUTO_VALUE_ON_ZERO подавляет это поведение для 0, так что только NULL генерирует следующий порядковый номер.

Этот режим может быть полезен, если в столбце AUTO_INCREMENT таблицы хранится 0. (Кстати, хранение 0 не рекомендуется).

Если вам явно не нужно, чтобы идентификатор был равен 0, тогда я бы не стал пытаться присвоить 0. Если идентификатор не имеет значения, то вы можете сделать это:

public function run()
{
$entidade = Patropi\Entidade::create([
'nome' => 'entidade 0',
'cpfcnpj' => '12345678901'
]);

Patropi\Fornecedor::create([
'id' => $entidade->id,
'prioridade' => '0'
]);
}

Или, если у вас есть настройки Eloquent:

public function run()
{
$entidade = Patropi\Entidade::create([
'nome' => 'entidade 0',
'cpfcnpj' => '12345678901'
]);

// assumes fornecedor() defines a hasone/hasmany relationship.
$entidade->fornecedor()->create([
'prioridade' => '0'
]);
}
1

Другие решения

Причина, по которой это происходит Атрибуты охраны. Атрибуты, перечисленные в $guarded массивы защищены от изменений, что означает, что Laravel будет игнорировать все ваши попытки их изменить. Иногда этот подход также известен как Защита массовых назначений.

По умолчанию Laravel защищает «id», поэтому вы не можете и не должны устанавливать их вручную, однако есть способ остановить это поведение по умолчанию. Они ключ в unguard() метод.

Вот как вы можете исправить свой код:

public function run()
{
Patropi\Entidade::unguard();

Patropi\Entidade::create([
'id' => '0',
'nome' => 'entidade 0',
'cpfcnpj' => '12345678901'
]);

Patropi\Fornecedor::create([
'id' => '0',
'prioridade' => '0'
]);
}
3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector