我的表格如下所示:
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 :(得分:1)
我的一个团队成员使用toArray()方法实现了它:
public function toArray()
{
$toArray = parent::toArray();
$toArray['thumbnailName'] = $this->thumbnailName;
return $toArray;
}
public function getThumbnailNameAttribute($value)
{
return self::getThumbnailUrl($value);
}
像魅力一样工作。
答案 1 :(得分:0)
仅当您访问模型上的属性时,才调用访问器/更改器。这些属性的用法如下:
$name = $image->thumbnail_name; // getThumbnailNameAttribute()
$image->thumbnail_name = 'foo'; // setThumbnailNameAttribute()
魔术属性名称将是StudlyCase属性名称的snake_case版本。
由于访问者的属性名称不是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