Красноречивый использовать значение по умолчанию, если столбец равен нулю

#eloquent

#красноречивый

Вопрос:

Я хочу использовать значение по умолчанию, если столбец равен нулю. Например:

Настройки (таблица):

 id | website_id | column1 | column2
1  |     1      |   null  |  null
 

Website.php:

 <?php

namespace AppModels;

class Website extends Model
{
    public function Setting(): HasOne
    {
        return $this->hasOne(IvendiFinanceCalculatorSetting::class)->withDefault([
            'column1' => 'Default',
            'column2' => 0,
 

Приведенный выше гипотетический пример, но вы можете видеть, чего я пытаюсь достичь. Если я добавлю в свою таблицу строку с соответствующим website идентификатором, но оставлю другие столбцы, поскольку null я хочу вернуть значения по умолчанию.

В настоящее время, если запрашивать Website модель с settings отношением, я получаю обратно строку, но column1 and column2 равно null, а не Default and 0 .

 dd(Website::query()->with('Setting')->find(1));
 

Ответ №1:

withDefault работает, когда отношение равно нулю, а не значения полей. Для получения дополнительной информации см. Шаблон нулевого объекта.

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

Затем в методе модели boot или классе observer вы можете установить значения настроек по умолчанию:

 // IvendiFinanceCalculatorSettingObserver.php example

public function creating (IvendiFinanceCalculatorSetting $setting) {
    $setting->setAttribute('column1', 'Default');
    $setting->setAttribute('column2', 0);
}
 

Другой подход заключается в установке значений по умолчанию непосредственно в свойстве атрибута модели:

 /**
 * The model's default values for attributes.
 *
 * @var array
 */
protected $attributes = [
    'column1' => 'Default',
    'column2' => 0
];
 

Комментарии:

1. Не видел этого ответа, но я пошел по этому пути, но я создал Trait , который затем подключился к retrieved событию. Спасибо!