Атрибут Lumen / Laravel get при использовании select и с - PullRequest
0 голосов
/ 27 сентября 2018

Я уже несколько раз сталкивался с этой проблемой и, похоже, не могу найти решение - мне кажется, что я упускаю что-то очевидное.

Я создаю JSON API с Lumen, создание конкретных маршрутов для конкретных случаев использования.Чтобы ускорить время загрузки, я хочу вывести только те поля, которые я буду использовать.

В моей модели есть комбинация полей, отношений и атрибутов. Я пытаюсь указать атрибут при ограничении вывода

Например:

A task имеет time_records.Каждый time_record имеет value из time.

Я хочу вывести имена задач, значения времени записи плюс атрибут totalTime, который я установил для task, как показано ниже(это не полный код, но, надеюсь, он натолкнется на идею)

class Task extends Model {

    protected $appends = [
        'totalTime'
    ];

    public function timeRecords() {
        return $this->hasMany('TimeRecord');
    }

    public function getTotalTimeAttribute() {
        $total = $this->timeRecords()->map(function($time_record){
            return $time_record->value;
        });

        return array_sum($total);
    }
}

Если я затем сделаю следующее:

Task::get();

И выведу это, я получу все задачис атрибутом totalTime.Однако, как уже упоминалось, я хочу вывести только некоторые атрибуты:

Task::select('id', 'name')
    ->with([
        'timeRecord' => function($query){
            $query->select('id');
        }
    ])

Независимо от того, что я делаю, я не могу получить вывод атрибута с этим.Значение есть в массиве, но является нулевым.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Вы можете получить это, используя with() метод без обратного вызова.Метод обратного вызова позволяет фильтровать результаты ..

Task::select('id', 'name')
    ->with("timeRecords:id") // use comma for multiple columns
    ->get();
0 голосов
/ 27 сентября 2018

Чтобы решить эту проблему, необходимо выбрать поля, к которым обращается атрибут.

Поскольку я был только , возвращая идентификатор time_record, атрибут не смог вычислитьtotal_time, так как поле value не было доступным.

(Только во время записи этого вопроса я нашел ответ ... ?)

...