#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. Приятно слышать, что вы пошли другим путем, но, пожалуйста, проверьте мой ответ выше и одобрите его, если это все равно поможет 🙂