Аксессоры и мутаторы Laravel не работают для имен полей таблицы Camel Case - PullRequest
0 голосов
/ 08 ноября 2018

Моя таблица выглядит следующим образом:

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()

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

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

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

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

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

0 голосов
/ 08 ноября 2018

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

$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

...