У меня есть модель, у которой есть собственный метод (предположим, что у него есть поле под названием 'fieldname'), например
class X extends \Eloquent
{
function custommethodtest()
{
return rand(1);
}
}
Я хочу использовать коллекцию и SUM по пользовательскому методу, то есть:
X:all()->sum('custommethodtest');
но кажется, что laravel будет только суммироваться фактическим полем, а не обычным методом. Например, это будет работать:
X::all()->sum('fieldname');
Любые идеи о том, как сделать эту работу?
Вместо простого метода создайте атрибут accessor:
public function getCustommethodtestAttribute(){
return rand();
}
А потом:
X:all()->sum('custommethodtest');
Вы можете использовать собственный атрибут для достижения такого же результата;
class X extends \Eloquent
{
protected $appends = [
'custom_test'
];
public function getCustomTestAttribute()
{
//NB: rand() expects exactly 2 parameters, am using 1234 for parameter 2 just for testing sake
return $this->attributes['custom_test'] = rand(1,1234);
}
}
Затем:
X:all()->sum('custom_test');
Метод выше, чем использование только:
public function getCustomTestAttribute(){
return rand(1);
}
По этой причине:
Как только атрибут был добавлен в список добавлений, он будет включен как в массив моделей, так и в формы JSON. Атрибуты в массиве appends учитывают видимую и скрытую конфигурацию модели.