1+ <?php
2+
3+
4+ namespace Smoren \Yii2 \QueryRelationManager \Base \Structs ;
5+
6+ /**
7+ * Class JoinCondition
8+ * Класс-хранилище данных join-отношения
9+ * @package Smoren\Yii2\QueryRelationManager\Base\Structs
10+ * @author Smoren <[email protected] > 11+ */
12+ class JoinCondition
13+ {
14+ /**
15+ * Отношение "один к одному"
16+ */
17+ const TYPE_SINGLE = 1 ;
18+
19+ /**
20+ * Отношение "один ко многим"
21+ */
22+ const TYPE_MULTIPLE = 2 ;
23+
24+ /**
25+ * @var int тип отношения (1 — "один к одному" или 2 — "один ко многим")
26+ */
27+ public $ type ;
28+
29+ /**
30+ * @var Table присоединяемая таблица
31+ */
32+ public $ table ;
33+
34+ /**
35+ * @var Table таблица, к которой осуществляется присоединение
36+ */
37+ public $ joinTo ;
38+
39+ /**
40+ * @var array основное условие присоединения
41+ * ["поле присоединяемой таблицы" => "поле таблицы, к которой осуществляется присоединение", ...]
42+ */
43+ public $ joinCondition ;
44+
45+ /**
46+ * @var string способ присоединения ("inner", "left", "right")
47+ */
48+ public $ joinType ;
49+
50+ /**
51+ * @var string дополнительное условие присоединения
52+ * Например: "and some_field = :some_value"
53+ */
54+ public $ extraJoinCondition ;
55+
56+ /**
57+ * @var array значения параметров дополнительного условия присоединения
58+ * Например: [":some_value" => "123", ...]
59+ */
60+ public $ extraJoinParams ;
61+
62+ /**
63+ * JoinCondition constructor.
64+ * @param int $type тип отношения (1 — "один к одному" или 2 — "один ко многим")
65+ * @param Table $table таблица, к которой осуществляется присоединение
66+ * @param Table $joinTo таблица, к которой осуществляется присоединение
67+ * @param array $joinCondition основное условие присоединения
68+ * @param string $joinType способ присоединения ("inner", "left", "right")
69+ * @param string|null $extraJoinCondition string дополнительное условие присоединения
70+ * @param array $extraJoinParams значения параметров дополнительного условия присоединения
71+ */
72+ public function __construct (
73+ int $ type , Table $ table , Table $ joinTo , array $ joinCondition ,
74+ string $ joinType = 'left ' , ?string $ extraJoinCondition = null , array $ extraJoinParams = []
75+ )
76+ {
77+ $ this ->type = $ type ;
78+ $ this ->table = $ table ;
79+ $ this ->joinTo = $ joinTo ;
80+ $ this ->joinCondition = $ joinCondition ;
81+ $ this ->joinType = $ joinType ;
82+ $ this ->extraJoinCondition = $ extraJoinCondition ;
83+ $ this ->extraJoinParams = $ extraJoinParams ;
84+ }
85+
86+ /**
87+ * Возвращает часть SQL-запроса, содержащую условия присоединения таблицы
88+ * @return string
89+ */
90+ public function stringify (): string
91+ {
92+ $ joins = [];
93+ foreach ($ this ->joinCondition as $ linkBy => $ linkTo ) {
94+ $ joins [] = "` {$ this ->table ->alias }`.` {$ linkBy }` = ` {$ this ->joinTo ->alias }`.` {$ linkTo }` " ;
95+ }
96+
97+ return implode (' AND ' , $ joins ).' ' .$ this ->extraJoinCondition ;
98+ }
99+ }
0 commit comments