2017-02-02 4 views
0

У меня есть три таблицы:Как разделить Eloquent отношений результат по атрибуту и ​​принимать только подсчитывать

Table : projects 
id, name 

Table : services 
id, project_id, name 

Table : tasks 
id, service_id, name, completed 
  • Каждый проект имеет множество услуг
  • Каждая служба имеет множество задач

Мой Eloquent Модели имеют следующие отношения, как указано выше:

class Project { 
    public function services() { 
     $this->hasMany('App\Service', 'project_id'); 
    } 

class Service { 
    public function project() { 
     $this->belongsTo('App\Project', 'project_id'); 
    } 

    public function tasks() { 
     $this->hasMany('App\Task', 'service_id'); 
    } 

class Task() { 
    public function service() { 
     $this->belongsTo('App\Service', 'service_id'); 
    } 
} 

Служба имеет множество задач. Если все задачи службы «завершены» = истинно, Служба завершена

Теперь я хочу запросить проекты LAST 5 с ЗАВЕРШЕННЫМИ УСЛУГАМИ и НЕ ЗАВЕРШЕНЫ УСЛУГИ.

Например:

  • Service 1 и обслуживание 2 принадлежат к проекту 1
  • Задача 1 (завершено) и Task 2 (завершено) принадлежат Service 1
  • Задача 3 (завершено) и задачи 4 (не заполнено) принадлежат Сервису 2

В этом случае проект 1 имеет 2 службы: сервис 1 (завершен, поскольку все его задачи завершены) и сервис 2 (не завершен, поскольку одна задача по-прежнему не выполнена компл eted).

Таким образом, результатом будет: project1 (все его данные) со счетом (services_completed) (будет 1) и со счетом (services_uncompleted) (тоже будет 1).

Я хочу запросить последние проекты x. Как я могу сделать запрос на все эти данные один раз, избегая запросов во время цикла foreach для сканирования массива проектов?

+0

Я не знаком с Laravel - SQL достаточно для ответа? – Bohemian

+0

Спасибо за ответ. Я могу фактически выполнить запрос в SQL. Меня интересует решение с Eloquent Models и его отношениями – Release

ответ

1

Я добавил бы «завершенный» флаг в таблицу сервисов. Я знаю, что это кажется излишним, и вы должны обновлять флаг, но каждый запрос на Сервисы должен быть проще.

+0

спасибо. Это тоже мое решение. Я добавил «завершенный» столбец в «Службы» и обновил его с помощью TaskObserver. – Release

+0

Законченный флаг на сервисах также хорош с логической точки зрения, вы можете выполнить сервис, даже если не все задачи были выполнены (т. Е. Задача была отменена). – dparoli