Yii all HAS_MANY relation condition?

Приветствую

Есть модель Project
Атрибуты: id, name

Есть модель Task
Атрибуты: id, project_id, name, accepted

В Project добавлена HAS_MANY relation (название relation - "tasks") с Task по (project_id => id).

Вопрос - как сформировать запрос при помощи ActiveRecord в методе search() (нужно формировать dataProvider для CListView + CPagination), который выбирал бы все Project, у которых все tasks.accepted = 1 ?

P.S.
Вся сложность заключается в том, чтобы учитывались проекты, у которых именно ВСЕ таски были завершены (а не хотя бы один таск)

Спасибо за внимание :)
  • Вопрос задан
  • 5981 просмотр
Пригласить эксперта
Ответы на вопрос 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Самый простой вариант:
SELECT p.id, p.name, COUNT(t.id) as non_accepted_tasks FROM projects p 
LEFT JOIN tasks t ON t.project_id=p.id AND t.accepted <> 1 
GROUP BY t.project_id
HEAVING non_accepted_tasks = 0;

что-то в этом духе.

Еще есть варианты с подзапросами и inner join.
Ответ написан
@maxyc_webber
Web-программист
public function getMembers($count = 100){
		return $this->hasMany(User::className(), ['id'=>'user_id'])
			->limit($count)
			->viaTable('users_clubs', ['club_id'=>'id'], function($query){
				$query->where(['status'=>User::STATUS_CLUB_JOINED_APPROVED]);
			});
	}


у hasMany есть третий параметр callback.
$this->hasMany(User::className(), ['id'=>'user_id'], function($query){ $query->where(['id'=>1]); })
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы