Создайте один мутатор для нескольких полей, используя 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 и что я игнорирую другие поля?

Спасибо за помощь

Вы можете использовать методы волшебные __set() и __get().

Alex Howansky 25.07.2018 17:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
1
1 162
2

Ответы 2

Как сказал Алекс, вы можете использовать __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

Это задумчиво.

Oluwatobi Samuel Omisakin 25.07.2018 18:55

Другие вопросы по теме