аксессоры laravel в контроллере?

Я добавил аксессоры и мутаторы в свою модель laravel.

public function getAmountAttribute($amount)
{
    return ($amount) / 100;
}
public function setAmountAttribute($amount)
{
    $this->attributes['amount'] = $amount * 100;
}

Они работают нормально для меня. В одном месте я столкнулся с проблемой: проблема в том, что я хочу применить агрегатную функцию в моем контроллере для поля суммы. Но аксессоры не работают.

Model::with(['xxx'])->where('parent_id', $id)->sum('amount')

Значение $id в порядке, я проверил. Это дает мне поле суммы суммы, где parent_id равен $id. Это должно дать результаты после погружения на 100.

Заранее спасибо.


person Kapil Verma    schedule 11.07.2016    source источник


Ответы (2)


Аксессоры и мутаторы позволяют форматировать атрибуты Eloquent при их извлечении из модели или установке их значения.

... не при запросе таблицы.

Model::with(['xxx'])
    ->addSelect(DB::raw('SUM(`table`.amount/100) as sum_of_amounts'))
    ->where('parent_id', $id)
    ->get();
person revo    schedule 11.07.2016

Аксессор/мутатор вызывается только тогда, когда вы получаете доступ к свойству из результата, но он не работает в запросе, поэтому вы не можете этого сделать, но в качестве альтернативы вы можете использовать Laravel Collection::sum(), например:

$collection = Model::with(['xxx'])->where('parent_id', $id)->get();
$someOfAmount = $collection->sum('amount');

Убедитесь, что вы создали защищенное свойство $appends в используемом Model, где оно имеет следующее:

protected $appends = ['amount'];

Примечание. Я не уверен, что это $appends обязательно, но вы можете попробовать.

person The Alpha    schedule 11.07.2016
comment
По моему мнению, $appends следует использовать, когда у нас нет поля в базе данных и мы хотим включить его в нашу коллекцию. Использование метода доступа в eloquent используйте таким образом, как в вашем ответе. Спасибо - person Kapil Verma; 12.07.2016