Мутатор Laravel 5.4 не работает

У меня есть мутатор, который не работает, я просмотрел здесь, попробовал некоторые предложения, но, похоже, ничего не работает.

Вот моя модель:

...

protected $fillable = [
    'energy_types'
];

...

public function getEnergyTypesAttribute($value)
{
    $types = explode(',', $value);
    $fuels = array();
    foreach($types as $type){
        switch ($type){
            case '2':
                $fuelType = 'Gas (Reticulated)';
                break;
            case '3':
                $fuelType = 'Gas (Bottled)';
                break;
            default:
                $fuelType = 'Electricity';
        }
        $fuels[] = array(   "id" => $type,
                            "name" => $fuelType);
    }

    return $fuels;
}

Хранится в базе данных так:

типы_энергии

1

1,2

1

Контроллер:

if($participant->isRetailer){
       $retail = Retailer::find($participant->id);
       $participant->energyTypes = $retail->energy_types;

Если я сделаю здесь дамп $retail, energy_types останется таким же:

["energy_types"]=>
    string(3) "1,2"

Я пытался изменить способ получения $retail, повторно мигрировал, пытался даже установить атрибут (тоже не работает).

Что я делаю не так?


person Seán McCabe    schedule 17.01.2018    source источник
comment
If I do a dump here - что ты скидываешь? Модель $retail? Является ли energy_types атрибутом в вашей базе данных или геттером для не-атрибута?   -  person fubar    schedule 18.01.2018
comment
например если я сделаю var_dump($retail). Energy_types — это столбец в базе данных. Я хочу, чтобы каждый раз, когда он выходит, преобразовать значения в массив, который вы видите выше.   -  person Seán McCabe    schedule 18.01.2018
comment
Можете ли вы попробовать изменить свой метод доступа, чтобы просто вернуть return 'test'; и посмотреть, вызывается ли он вообще? Дамп $retail и доступ к $retail->energy_types   -  person fubar    schedule 18.01.2018
comment
@fubar, кажется, работает, и я только что попробовал $retail-›energy_types, и он возвращает то, что я хочу. На самом деле не уверен, что здесь произошло и почему это волшебным образом работает.   -  person Seán McCabe    schedule 18.01.2018
comment
Ваш метод работает и сейчас или только return 'test'? И работает ли сброс значения или только прямой доступ к нему?   -  person fubar    schedule 18.01.2018


Ответы (1)


Во-первых, функции Mutator похожи на «setEnergyTypesAttribute».

Однако ваши фрагменты кода показывают, что вы пытаетесь определить Accessor.

В любом случае, если вы пытаетесь добавить пользовательский атрибут в модель при извлечении данных из базы данных, вот как вы это делаете.

...
protected $appends = ['foo'];
...
public function getFooAttribute()
{
    return $this->attributes['bar'] . ' foo'; 
}

где «бар» — исходный атрибут в Модели.

Надеюсь, поможет.

person Sem    schedule 29.07.2019
comment
Привет, Сем, на самом деле решил это давно, но хорошо, что ответил, спасибо :) - person Seán McCabe; 29.07.2019