2016-12-19 5 views
1

Я хотел бы с нетерпением загружать следующий фрагмент кода.Laravel: Eloquent Eager loading с пользовательским запросом

return DB::table('container_slots') 
->where('occupied', false) 
->join('plate_containers','container_slots.plate_container_id', '=', 'plate_containers.id') 
->select('plate_containers.name AS Container', DB::raw('count(container_slots.slot) as no_of_slots')) 
->groupBy('plate_container_id')->get(); 

После вызова метода индекса.

public function index() 
{ 
    $plateContainers = PlateContainer::with('equipmentStatusCode','storageLocation','plateContainerType')->paginate(10)->toArray(); 

    return response()->success($plateContainers); 
} 

Каков наилучший способ для этого?

Я думал, что могу сделать что-то вроде этого.

PlateContainer Модель

public function slotsCount() 
{ 
    return $this->containerSlots() 
    ->where('occupied', false) 
    ->join('plate_containers','container_slots.plate_container_id', '=', 'plate_containers.id') 
    ->select('plate_containers.name AS Container', DB::raw('count(container_slots.slot) as no_of_slots')) 
    ->groupBy('plate_container_id'); 
} 

public function getSlotsCountAttribute() 
{ 
    $this->load('slotsCount'); 

    $related = $this->getRelation('slotsCount'); 

    return $related; 
} 

Но это возвращает

"сообщение": "Метод addEagerConstraints не существует.",

Спасибо за ваше время.

ответ

0

Я думаю, что вы вызываете неправильное отношение, когда вы делаете:

$this->load('slotsCount'); 

«slotsCount()» это просто метод, который не имеет «addEagerConstraints) (» метод.

Реальное отношение - это «containerSlots», как я могу догадаться из кода.

После некоторого тестирования в аналогичной ситуации, я думаю, что гуманного может быть:

public function getSlotsCountAttribute() 
{ 
    $this->load('containerSlots'); 
    return $this->slotsCount(); 
} 

Так вызов «getSlotsCountAttribute()», первый eagers нагрузить отношение, а затем возвращает количество.

+0

Это возвращает пустой массив '" get_slots_count_attribute ": []' – user3641381

+0

Пустой набор результатов является допустимым результатом в зависимости от данных. Является ли запрос в 'slotsCount()' фактическим получением информации? Я бы проверял, что запрос выполняет свою работу в первую очередь. –

+0

'slotsCount()' ничего не возвращает. Я проверил запрос раз в несколько раз, где и он просто работает. – user3641381