Laravel Accessors和Mutators不适用于Camel Case表字段名称

inn6fuwd  于 2023-05-30  发布在  其他
关注(0)|答案(3)|浏览(109)

我的表看起来像下面:

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()这样的事件处理方法?

iecba09b

iecba09b1#

我的一个团队成员使用toArray()方法实现了它:

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

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

很管用。

rseugnpd

rseugnpd2#

访问器/修改器仅在访问模型上的属性时调用。这些属性的用法如下:

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

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

神奇的属性名将是StudlyCase属性名的snake_case版本。
由于访问器的属性名不是thumbnail_name,Laravel不会自动找到原始值。你可以直接从模型的attributes数组中获取:

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

请注意,您仍然需要调用save(),以使mutator所做的更改显示在数据库中。
如果您希望在模型为savingcreatingrestored等时自动执行某些操作。则可以侦听相应的生命周期事件:https://laravel.com/docs/5.7/eloquent#events

xxhby3vn

xxhby3vn3#

protected $appends=['thumbnailName'];
public function getThumbnailNameAttribute()
{
  $vale=$this->attributes["thumbnailName"];
  
}

相关问题