Scope для выборки моделей, у которых есть определенные связи

Рейтинг: 1Ответов: 1Опубликовано: 24.10.2014

Возникла такая надобность:

  1. Есть модель Group, с HAS_MANY связью к модели ScheduleElement
  2. Нужно сделать scope, который бы ограничивал выборку групп, отдавать только те, у которых есть ScheduleElement'ы (хотя бы одни) на каждую комбинацию week_day (1-7) и week_number (1-2) c одним и тем же semester_id.

Не могу понять, возможно ли это сделать :-(

Ответы

▲ 1Принят

Решил проблему сам, кому интересно, вот код: https://github.com/sc0rp1d/schedule/blob/e510ad72b95e9491af9ff2f5692d9b0e469140f7/models/Group.php#L95

public function filled($bool = true)
    {
    $schedule_table = ScheduleElement::model()->tableName();
    $semester = Semesters::model()->actual();
    $criteria = $this->getDbCriteria();
    $criteria->params[':semester_id'] = $semester->id;
    for ($i = 1; $i <= 2; $i++) {
        for ($j = 1; $j <= 6; $j++) {
            $sql = "(SELECT COUNT(*) FROM `$schedule_table` 
                WHERE `$schedule_table`.`week_number` = $i 
                AND `$schedule_table`.`week_day` = $j 
                AND `$schedule_table`.`group_id` = `t`.`id` 
                AND `$schedule_table`.`semester_id` = :semester_id) " 
                . ($bool ? ">" : "=") . " 0";
            $criteria->addCondition($sql, $bool ? 'AND' : 'OR');
        }
    }
    return $this;
}