Laravel: сбор сумм нестандартным методом

1

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

class X extends \Eloquent 
{
    function custommethodtest()
       {
           return rand(1);
       }
}

Я хочу использовать коллекцию и SUM по пользовательскому методу, то есть:

 X:all()->sum('custommethodtest');

но кажется, что laravel будет только суммироваться фактическим полем, а не обычным методом. Например, это будет работать:

X::all()->sum('fieldname');

Любые идеи о том, как сделать эту работу?

  • 0
    если вы хотите вернуть custommethodtest в качестве имени поля (атрибута) пользовательской таблицы, то вы можете определить метод доступа
  • 0
    пожалуйста, нам нужен отзыв. :)
Теги:
eloquent
laravel-4

2 ответа

0

Вместо простого метода создайте атрибут accessor:

public function getCustommethodtestAttribute(){
    return rand();
}

А потом:

X:all()->sum('custommethodtest');
0

Вы можете использовать собственный атрибут для достижения такого же результата;

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 учитывают видимую и скрытую конфигурацию модели.

  • 0
    Если атрибут не нужен в массиве и представлении JSON, добавление его не имеет смысла. И это зависит от ОП, чтобы решить. Это не "лучше"
  • 0
    Также установка атрибута в атрибуте доступа не является необходимой. Будет кешироваться автоматически
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню