@@ -55,6 +55,11 @@ class Table
5555 */
5656 protected $ pkFieldMapReverse = [];
5757
58+ /**
59+ * @var array цепочка полей первичных ключей подключаемых таблиц до данной
60+ */
61+ protected $ pkFieldChain = [];
62+
5863 /**
5964 * Table constructor.
6065 * @param string $className ORM-класс, представляющий таблицу
@@ -118,6 +123,21 @@ public function stringifyPrimaryKey(): string
118123 return implode ('- ' , $ this ->primaryKey );
119124 }
120125
126+ /**
127+ * Проверка наличия данных из таблицы в кортеже, представляющем из себя строку из результата запроса к БД
128+ * @param array $row строка из результата запроса SELECT
129+ * @return bool
130+ */
131+ public function issetDataInRow (array &$ row ): bool
132+ {
133+ foreach ($ this ->pkFieldMapReverse as $ prefixedKey => $ key ) {
134+ if ($ row [$ prefixedKey ] !== null ) {
135+ return true ;
136+ }
137+ }
138+ return false ;
139+ }
140+
121141 /**
122142 * Получение данных из кортежа, представляющего из себя строку из результата запроса к БД
123143 * @param array $row строка из результата запроса SELECT
@@ -137,10 +157,8 @@ public function getDataFromRow(array $row, JoinConditionCollection $conditionCol
137157 {
138158 $ item = [];
139159
140- foreach ($ row as $ key => $ val ) {
141- if (isset ($ this ->fieldMapReverse [$ key ])) {
142- $ item [$ this ->fieldMapReverse [$ key ]] = $ val ;
143- }
160+ foreach ($ this ->fieldMapReverse as $ fieldPrefixed => $ field ) {
161+ $ item [$ field ] = $ row [$ fieldPrefixed ];
144162 }
145163
146164 /** @var JoinCondition $cond */
@@ -159,13 +177,13 @@ public function getDataFromRow(array $row, JoinConditionCollection $conditionCol
159177
160178 $ primaryKeyValue = $ this ->stringifyPrimaryKeyValue ($ row );
161179
162- try {
180+ if ( $ conditionCollection -> issetByJoinAs ( $ this -> alias )) {
163181 $ cond = $ conditionCollection ->byJoinAs ($ this ->alias );
164182 $ joinTo = $ cond ->joinTo ;
165183 $ aliasTo = $ joinTo ->alias ;
166184 $ foreignKeyValue = $ joinTo ->stringifyPrimaryKeyValue ($ row );
167185 $ type = $ cond ->type ;
168- } catch ( QueryRelationManagerException $ e ) {
186+ } else {
169187 $ aliasTo = null ;
170188 $ foreignKeyValue = null ;
171189 $ containerFieldAlias = null ;
@@ -189,21 +207,28 @@ public function getPrimaryKeyForSelect(): array
189207 return $ result ;
190208 }
191209
210+ /**
211+ * Установка цепочки полей первичных ключей присоединяемых таблиц до данной
212+ * @param array $pkFieldChain
213+ * @return $this
214+ */
215+ public function setPkFieldChain (array $ pkFieldChain ): self
216+ {
217+ $ this ->pkFieldChain = $ pkFieldChain ;
218+ return $ this ;
219+ }
220+
192221 /**
193222 * Получение значений полей первичного ключа таблицы в виде строки через дефис
194223 * @param array $row строка из результата запроса SELECT
195224 * @return string
196- * @throws QueryRelationManagerException
197225 */
198226 protected function stringifyPrimaryKeyValue (array $ row ): string
199227 {
200228 $ primaryKeyValues = [];
201229
202- foreach ($ this ->pkFieldMapReverse as $ fieldPrefixed => $ field ) {
203- if (!isset ($ row [$ fieldPrefixed ])) {
204- throw new QueryRelationManagerException ("no primary key field ' {$ field }' found in row " );
205- }
206- $ primaryKeyValues [] = $ row [$ fieldPrefixed ];
230+ foreach ($ this ->pkFieldChain as $ field ) {
231+ $ primaryKeyValues [] = $ row [$ field ];
207232 }
208233
209234 return implode ('- ' , $ primaryKeyValues );
0 commit comments