Laravel 访问器和修改器不适用于 Camel Case table 字段名称
Laravel Accessors and Mutators not working for Camel Case table fields names
我的 table 如下所示:
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 不会执行以上两种方法来自定义我的 table 字段值。
ProductCategoryImage 模型扩展自自定义 BaseModel,BaseModel 扩展自 Eloquent。
Laravel 没有像 beforeFind()、afterFind()、beforeSave()、afterSave() 这样的事件处理方法吗?
Accessors/mutators 仅在您访问模型上的 属性 时调用。这些属性将像这样使用:
$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
我的一个团队成员使用 toArray() 方法实现了它:
public function toArray()
{
$toArray = parent::toArray();
$toArray['thumbnailName'] = $this->thumbnailName;
return $toArray;
}
public function getThumbnailNameAttribute($value)
{
return self::getThumbnailUrl($value);
}
像魅力一样工作。
我的 table 如下所示:
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 不会执行以上两种方法来自定义我的 table 字段值。
ProductCategoryImage 模型扩展自自定义 BaseModel,BaseModel 扩展自 Eloquent。
Laravel 没有像 beforeFind()、afterFind()、beforeSave()、afterSave() 这样的事件处理方法吗?
Accessors/mutators 仅在您访问模型上的 属性 时调用。这些属性将像这样使用:
$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
我的一个团队成员使用 toArray() 方法实现了它:
public function toArray()
{
$toArray = parent::toArray();
$toArray['thumbnailName'] = $this->thumbnailName;
return $toArray;
}
public function getThumbnailNameAttribute($value)
{
return self::getThumbnailUrl($value);
}
像魅力一样工作。