Laravel 5.5: есть ли что-то вроде глобального мутатора для всех моделей Eloquent? - PullRequest
1 голос
/ 19 июня 2019

Все мои модели расширяются Illuminate\Database\Eloquent\Model. Я хочу, чтобы каждая модель отображала created_at, updated_at и deleted_at в определенном формате даты или оставляла как null, если дата не установлена, когда я получаю / извлекаю данные из БД (на лету).

Я мог бы использовать мутатор и определить public function setCreatedAtAttribute(), проверить, является ли значение датой Углерода, а затем вызвать желаемое ->format(), но мне нужно было бы сделать это (определить этот метод) для каждой модели для каждого столбца даты.

С другой стороны, родитель Model живет в vendor, поэтому я не могу его изменить. Есть ли способ определить и применить его глобально ко всем моим моделям?

PS. Мой вопрос не о модификации:

/**
 * The storage format of the model's date columns.
 *
 * @var string
 */
protected $dateFormat;

Как (если я правильно понимаю) это отвечает за настройку формата даты при хранении данных в базе данных. Я хочу оставить все как есть. Так что никаких изменений на уровне БД. Я хочу установить новый формат даты при поиске на лету.

1 Ответ

1 голос
/ 19 июня 2019

Вы можете создать trait и использовать его в своих моделях:

trait DatesTrait
{
    /**
     * Mutator for created_at
     */
    public function getCreatedAtAttribute($value)
    {
        return $this->formatDatetime($value);
    }

    /**
     * Mutator for updated_at
     */
    public function getUpdatedAtAttribute($value)
    {
        return $this->formatDatetime($value);
    }

    /**
     * Replace this with any formatting logic that suits your needs
     */
    protected function formatDatetime($value)
    {
        if (is_null($value)) {
            return $value;
        }

        if (is_string($value)) {
            $value = \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $value);
        }

        return $value->format('Y-m-d H:i:s');
    }
}

Тогда в каждой модели:

class ModelX
{
    use DatesTrait;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...