Аксессоры и мутаторы Laravel не работают с именами полей таблицы Camel Case

Моя таблица выглядит так:

CREATE TABLE IF NOT EXISTS `ProductCategoryImage` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`productCategoryId` INT(11) NOT NULL,
`imageName` VARCHAR(255) NOT NULL,
`thumbnailName` VARCHAR(255) NULL DEFAULT NULL,
`location` TINYINT(2) NOT NULL DEFAULT 1,
`status` TINYINT(2) NOT NULL DEFAULT 1,
`createdAt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
`deletedAt` DATETIME NULL DEFAULT NULL,
`createdById` INT(11) NOT NULL DEFAULT -1,
`updatedById` INT(11) NULL DEFAULT NULL,
`deletedById` INT(11) NULL DEFAULT NULL
);

Внутри модели ProductCategoryImage я записал два метода ниже:

public function getThumbnailNameAttribute($value)
{
return self::getThumbnailUrl($value);
}
public function setThumbnailNameAttribute($value)
{
$this->attributes['thumbnailName'] = $value;
}

Laravel не будет выполнять выше двух методов для настройки значения моего поля таблицы.

Модель ProductCategoryImage расширяется от пользовательской BaseModel, а BaseModel расширяется от Eloquent.

Разве в Laravel нет методов-обработчиков событий, таких как beforeFind (), afterFind (), beforeSave (), afterSave ()?

0

Решение

Аксессоры / мутаторы вызываются только при доступе к свойству модели. Эти атрибуты будут использоваться следующим образом:

$name = $image->thumbnail_name; // getThumbnailNameAttribute()

$image->thumbnail_name = 'foo'; // setThumbnailNameAttribute()

Волшебным именем свойства будет версия snake_case вашего имени атрибута StudlyCase.

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

public function getThumbnailNameAttribute($value)
{
return self::getThumbnailUrl($this->attributes['thumbnailName']);
}

Обратите внимание, что вам все еще нужно позвонить save() чтобы изменения, сделанные мутатором, появились в вашей базе данных.

Если вы хотите, чтобы определенные вещи происходили автоматически, когда модель saving, creating, restoredи т.д., затем вы можете прослушать соответствующее событие жизненного цикла: https://laravel.com/docs/5.7/eloquent#events

0

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

Один из членов моей команды достиг этого, используя метод toArray ():

public function toArray()
{
$toArray = parent::toArray();
$toArray['thumbnailName'] = $this->thumbnailName;
return $toArray;
}

public function getThumbnailNameAttribute($value)
{
return self::getThumbnailUrl($value);
}

Работал как шарм.

0

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