0
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 字段上的表。这还没有实现

请寻求帮助?

谢谢

4

1 回答 1

0

在 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 是怎么做的。

尝试这个:

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

where$expr可以是简单的字符串

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

但绝对首选的方法是使用 DSQL Expression 对象

// 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',
]);

PS 以上所有代码均未经测试。如果您发现任何错误,请在评论中告诉我,我会修复。

于 2021-10-19T20:53:36.327 回答