левое соединение и неидентифицированное соединение в agiletoolkit atk4

#sql #join #atk4 #agiletoolkit

Вопрос:

 SELECT t1.field1, t1.field2, t1.field3, t2.field4, t2.field5,t2.field6 
FROM table1 AS t1 LEFT JOIN table2 AS t2 
ON t1.field1 = t2.field1 AND t1.field2 = t2.field2
WHERE t1.fieldstart <='2021-10-13' AND t1.fieldend >= '2021-10-31' OR t2.submitted_by='xyz';
 

Я хочу преобразовать запрос выше в код agile toolkit akt4 , любую идею о том, как выполнить левое присоединение в agiletoolkit , каждый раз, когда я использую join, дайте мне внутреннее присоединение, я хочу, чтобы левое присоединение

 $j_table = $m->join('table2.nameid');           
 

Я пробовал это, это выглядит нормально

 $j_table = $m->leftjoin('table2.nameid');     
 

Как бы то ни было, когда я пытаюсь присоединиться без идентификатора, я получаю эту ошибку

 $j_table = $m->leftjoin('table2.name','name');     
 

Фатальная ошибка
atk4данныеИсключение: Вы пытаетесь связать таблицы с полями, не имеющими идентификаторов. Это еще не реализовано

вам нужна помощь, пожалуйста ?

Спасибо

Комментарии:

1. Мы постоянно совершенствуем инструментарий Agile, поэтому нам нужно знать, какую версию atk4 вы используете. В какой-то момент было введено такое ограничение, что вы можете объединять таблицы только по полям идентификаторов.

2. Версия Agiletoolkit akt4 1.7.1

Ответ №1:

В Agile Toolkit v1.7.1 (ветка legacy/v1) единственный вариант, как это сделать, находится на базовом уровне DSQL.

Чтобы получить экземпляр DSQL из модели, используйте:

 $model->table_alias = 't1';
$q = $model->dsql();
 

Пример кода DSQL ниже:

 // You can use expression for more complex joins
$q->join('table2',
    $q->andExpr() // or orExpr()
        ->where('t1.field1=t2.field1')
        ->where('t1.field1=t2.field2'),
    'left',
    't2'
)
 

Плохо в этом подходе то, что, как только вы «переходите» с уровня модели данных на более низкий уровень DSQL, вы как бы заперты там и не можете использовать все приятные функции модели данных, потому что она не знает о соединениях, определенных в dsql. По крайней мере, так я это помню. За последние несколько лет многое изменилось в инструментарии…


РЕДАКТИРОВАТЬ: О, на самом деле похоже, что если бы я нашел, как это можно было сделать только с моделью в то время.

Попробуй это:

 $model->join('table2',
  [
    'foreign_alias' => 't2',
    'on' => $expr,
  ],
  'left'
);
 

где $expr может быть просто строка типа

 $expr = 't1.field1=t2.field1 AND t1.field2=t2.field2';
 

но определенно предпочтительным способом является использование объекта выражения DSQL, такого как

 // which is functionally the same as above string approach
$expr = $model->expr('t1.field1=t2.field1 AND t1.field2=t2.field2');

// this is much better because takes care of escaping and table alias automatically
$expr = $model->expr('{}={} AND {}={}', [
    $model->getField('field1'),
    't2.field1',
    $model->getField('field2'),
    't2.field2',
]);
 

P.S. Весь приведенный выше код не проверен. Если вы обнаружите какую-либо ошибку, пожалуйста, сообщите мне в комментариях, и я исправлю ее.

Комментарии:

1. Я пошел другим путем, вместо этого оставил соединение, я просто вставляю их в одну таблицу и вызываю ее из модели . Большое спасибо за то, что поделились информацией

2. Приятно слышать, что вы пошли другим путем, но, пожалуйста, проверьте мой ответ выше и одобрите его, если это все равно поможет 🙂