使用laravel 5.6为多个字段创建单个更改器

时间:2018-07-25 15:33:07

标签: php laravel laravel-5.6

我想创建一个变种器,该变种器将为我服务于表的多个字段。我有几个字段,分别为:h1,h2,h3和其他字段。

现在,我为每个字段(h1,h2和h3)都有一个变量,其工作方式如下:

如果有值,则将该值插入到字段h1,h2或h3中,但如果没有,则插入0。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Custom extends Model
{
   protected $fillable = array(
      'h1', 'h2', 'h3', 'other_field', 'other_field2'
   );

  public function setH1Attribute($value)
  {
    if(!empty($value))
        $this->attributes['h1'] = $value;
    else
        $this->attributes['h1'] = 0;
  }

  public function setH2Attribute($value)
  {
    if(!empty($value))
        $this->attributes['h2'] = $value;
    else
        $this->attributes['h2'] = 0;
  }

  public function setH3Attribute($value)
  {
    if(!empty($value))
        $this->attributes['h3'] = $value;
    else
        $this->attributes['h3'] = 0;
  }
}

我该如何创建一个加速器来加速此任务,但只对h1,h2,h3字段起作用,而忽略其他字段呢?

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

就像亚历克斯所说,您可以使用data.table,检查属性是否可填充,然后根据名称和值设置属性。

__set()

像这样使用它:

public function __set($name, $value) 
{
    if (array_key_exists($name, $this->fillable) {
        $this->attributes[$name] = !empty($value) ? $value : 0;
    }
}

public function __get($name) 
{
    return $this->attributes[$name];
}

请注意,您还应处理不可填充的条件,并获取不存在的属性。这只是一个基本的实现。

答案 1 :(得分:1)

@Ohgodwhy的回答很好,但是我可以确保您是否覆盖__set()以默认使用Laravel功能:

public function __set($key, $value)
{
    if(in_array($key, ['h1', 'h2', 'h3'])){
        //do your mutation
    } else {
        //do what Laravel normally does
        $this->setAttribute($key, $value);
    }
}

模型来源:https://github.com/laravel/framework/blob/5.6/src/Illuminate/Database/Eloquent/Model.php#L1485