2017-01-03 11 views
0

Каков правильный способ реализации значений по умолчанию для моделей Eloquent?

Я настроил таблицы базы данных, используя миграции Laravel. В некоторых столбцах указаны значения по умолчанию. При использовании этих таблиц в сочетании с моделями Eloquent в зависимости от выбранного драйвера базы данных происходят разные вещи:

В MySQL при создании новой модели и ее сохранении вставляется строка DB со значением по умолчанию для каждого атрибута, явно не указано. Это то, что я хотел бы совершить.

В Postgres и SQLite, однако, это не тот случай. PDOException брошен:

[PDOException]
SQLSTATE[23502]: Not null violation: 7 ERROR: null value in column "some_column" violates not-null constraint
DETAIL: Failing row contains (1, 2, 3, 4, 5, 6, null, null, null, null, null, null, 7, 8, null, 9, null, null, 10, 11, 12, null).

Это для меня ясно, что столбец не обнуляемый и что нулевые значения не принимается. Однако я ожидал бы, что значение по умолчанию было вставлено вместо поднятой ошибки.

+0

Какой тип данных является той переменной в вашей миграции? – lewis4u

+0

@ lewis4u Это 'tinyInteger'. –

ответ

0

SQL NOT NULL Ограничение

NOT NULL ограничение обеспечивает столбец не принимать NULL значения.

вы добавляете нулевое значение на NOT NULL столбца

кажется

http://www.w3schools.com/sql/sql_notnull.asp

+0

Хорошо, интересно посмотреть, что это работает в MySQL. Тем не менее, остается вопрос, каким правильным способом реализовать значения по умолчанию в Eloquent. –

1

Я хотел бы предложить вам создать свою собственную родительскую модель, которая расширяет красноречивую непосредственно, и все ваши модели расширьте этот пользовательский родитель.

В пользовательском родительском объекте переопределите метод performInsert() для удаления значений null перед вставкой. Обязательно скопируйте весь метод из исходного кода красноречив, так что вы не потеряете какие-либо важные шаги в процессе:

class MyModelParent extends Illuminate\Database\Eloquent\Model 
{ 
    /** 
    * Perform a model insert operation. 
    * 
    * @param \Illuminate\Database\Eloquent\Builder $query 
    * @return bool 
    */ 
    protected function performInsert(Builder $query) 
    { 
     if ($this->fireModelEvent('creating') === false) { 
      return false; 
     } 

     ... // Be sure to copy all of it! 

     // This is the change you'll make. Before, it was just: 
     // $attributes = $this->attributes; 
     $attributes = array_filter($this->attributes, function($val){ 
      return $val !== null; 
     }); 

     ... // Be sure to copy all of it! 

     return true; 
    } 
} 

performUpdate() должен обрабатывать этот вопрос хорошо, так как он использует getDirty(), чтобы получить список полей вместо доступа к собственности напрямую.

И пока вы на нем, вам следует рассмотреть вопрос о внесении патча в Laravel, который сделает основной Postgres-safe.

+0

Благодарим вас за ответ. Остается вопрос: какой предпочтительный способ реализовать значения по умолчанию для моделей Eloquent? Это особенно верно для булевых и «перечислений» (только целых констант, определенных в моделях). –

+0

@TomLank. Это решение должно генерировать инструкцию INPUT, которая игнорирует нулевые значения, оставляя базу данных позаботиться о значениях по умолчанию. Вам не нужно беспокоиться о дефолтах в вашей модели. – mopo922

+0

Я проверю это. Ty. –

Смежные вопросы