COLLECTION JOIN
CollectionJoin - этот класс содержит коллекцию экземпляров класса Join
. Способен генерировать join
фрагмент sql кода, содержащий множество подключений таблиц средствами join. Экземпляр класса получаем
через фабрику (смотри раздел УСТАНОВКА).
Описание функций и методов
Метод | Описание |
---|---|
__construct($settings) | Экземпляр класса создается в фабрике и при создании в конструктор передается массив настроек (смотри раздел УСТАНОВКА). |
addNew($mergeMethod, $table, $column, $outColumn) |
Создает экземпляр класса Join и добавляет в коллекцию.
Затем возвращает сгенерированный псевдоним для таблицы.
|
add($join) |
Добавляет экземпляр класса Join в коллекцию и возвращает сгенерированный псевдоним для таблицы.
|
get($alias) |
Получить экземпляр класса Join из коллекции по псевдониму таблицы.
|
getAll() |
Получить всю коллекцию экземпляров класса Join .
|
getAllAlias() | Получить все псевдонимы таблиц в коллекции. |
getSql() |
Получить строку sql запроса, данные формируются после вызова функции generate() .
|
getBind() |
Получить массив биндов. Данные формируются после вызова функции generate() .
|
remove($alias) | Удалить элемент коллекции по псевдониму таблицы. |
generate() | Генерирует sql и массив биндов. |
Примеры
Пример 1
Cодержимое таблиц:
mark (m) | |||
id | student id | lesson id | mark |
---|---|---|---|
1 | 1 | 1 | 3 |
2 | 1 | 1 | 4 |
3 | 1 | 2 | 2 |
4 | 1 | 2 | 2 |
5 | 1 | 2 | 3 |
6 | 1 | 4 | 5 |
7 | 2 | 1 | 2 |
8 | 2 | 1 | 3 |
9 | 2 | 2 | 5 |
10 | 2 | 4 | 4 |
11 | 2 | 3 | 3 |
12 | 2 | 3 | 2 |
13 | 2 | 2 | 5 |
14 | 2 | 3 | 3 |
15 | 2 | 1 | 2 |
16 | 3 | 4 | 2 |
17 | 3 | 1 | 5 |
18 | 3 | 2 | 2 |
19 | 3 | 4 | 3 |
20 | 3 | 3 | 4 |
student (s) | |||
id | name | semester number | |
---|---|---|---|
1 | Даша | 1 | |
2 | Маша | 4 | |
3 | Паша | 2 |
Пользователь должен иметь возможность получить всех студентов, которые подходят под указанные им критерии, а именно пользователь указывает оценки и массив id предметов, у которых должна встречаться такая оценка.
// Функция принимает массив, где ключи - это оценки, а значения – массив id предметов, у которых // должна встречаться такая оценка. На выходе функция возвращает экземпляр объекта CollectionJoin function joinForMarks ($marks) { // Создаем экземпляры классов CollectionJoin и Join с помощью фабрики, подробнее // в документации в разделе УСТАНОВКА (здесь случай компонента для yii2). $cJn = Yii::$app->gp->collectionJoin(); foreach ($marks as $mark => $lessonId) { $join = Yii::$app->gp->innerJoin('mark', 'student_id', 's.id'); $join->linkAnd([[$join->getAlias() . '.mark', '=', $mark], [$join->getAlias() . '.lesson_id', 'in', $lessonId]]); $cJn->add($join); } return $cJn; } $cJoin = joinForMarks(['2' => [1,2,3,4], '5' => [1, 2]]); $rez = $qr->sql("select s.name from student s inner join mark m on s.id = m.student_id /*join*/ group by s.name") ->join('/*join*/', $cJoin)->sortDesc('name')->all(); // Представленные ниже 2 записи выполняют одно и тоже: // join('/*join*/', $cJoin) // sqlPart('/*join*/', $cJoin->generate()->getSql(), $cJoin->getBind())
В результате будет сгенерирован примерно следующий sql запрос:
select s.name from student s inner join mark m on s.id = m.student_id inner join mark m5 on s.id = m.student_id and m5.mark = 2 and m5.lesson_id in (1,2,3,4) inner join mark m2 on s.id = m.student_id and m5.mark = 5 and m5.lesson_id in (1,2) group by s.name
var_dump($rez)); // Результат: [ 0 => ['NAME' => 'Паша'] 1 => ['NAME' => 'Маша'] ]