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';我想把上面的查询转换成敏捷工具包的akt4代码,有没有关于如何在敏捷工具包中做左连接的想法,每次我使用join它都会给我内部连接,我想要左连接
$j_table = $m->join('table2.nameid'); 我试过了,看起来很好。
$j_table = $m->leftjoin('table2.nameid'); 但是,当我尝试使用none id连接时,会出现以下错误
$j_table = $m->leftjoin('table2.name','name'); 致命错误atk4\data\Exception:您正在尝试链接非id字段上的表。这还没有实现
想找人帮忙吗?
谢谢
发布于 2021-10-19 20:53:36
在Agile Toolkit v1.7.1 (遗留/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',
]);附言:上面的所有代码都是未经测试的。如果你发现任何错误,请在评论中告诉我,我会修复的。
https://stackoverflow.com/questions/69573140
复制相似问题