我想创建一个变种器,该变种器将为我服务于表的多个字段。我有几个字段,分别为: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字段起作用,而忽略其他字段呢?
感谢您的帮助
答案 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