#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
событию. Спасибо!