Я пытаюсь заполнить таблицу 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? Заранее спасибо.
хранения 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'
]);
}
Причина, по которой это происходит Атрибуты охраны. Атрибуты, перечисленные в $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'
]);
}