Я хочу создать мутатор, который будет обслуживать меня для нескольких полей таблицы. У меня есть несколько названий полей: 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 и что я игнорирую другие поля?
Спасибо за помощь






Как сказал Алекс, вы можете использовать __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];
}
Используйте это так:
$custom->h1 = 'Hello';
$custom->h2 = '';
echo $custom->h1; // produces 'Hello';
echo $custom->h2; // produces 0;
Обратите внимание, что вы также должны обрабатывать условия, когда он не заполняется, а также получать свойства, которые не существуют. Это просто базовая реализация.
@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
Это задумчиво.
Вы можете использовать методы волшебные
__set()и__get().