CakePHP 3使用查询构建器构建复杂连接

时间:2015-05-25 21:44:18

标签: cakephp query-builder cakephp-3.0

我需要动态地在相同的表上添加联接......像这样:

// foreach ... as $id
$options['join']['T_Values' . $id] = [
    'type' => 'LEFT',
    'table' => 't_values',
    'conditions' => ['T_Values' . $id . '.t_id = T.id']
];
$options['join']['Values' . $id] = [
    'type' => 'LEFT',
    'table' => 'values',
    'conditions' => ['Values' . $id . '.id = T_Values' . $id . '.value_id', 'Values' . $id . '.v_id' => $id]
];

$options['fields']['x_' . $id] = 'Values' . $id . '.name';
// endforeach

问题是没有选择第二个值 - 它是null。这可以通过将第二个连接类型更改为' INNER'来解决,但这是一个问题,因为T中的现有记录没有结果但T_Values中缺少记录。这种类型的连接可以处理它:

SELECT … 
FROM t T 
  LEFT JOIN (t_values T_Values2
    INNER JOIN values Values2 ON 
    (Values2.id = T_Values2.value_id AND Values2.v_id = 2)
  ) ON T_Values2.t_id = T.id  
  LEFT JOIN (t_values T_Values3 
    INNER JOIN values Values3 ON 
    (Values3.id = T_Values3.value_id AND Values3.v_id = 3)
  ) ON T_Values3.t_id = T.id  
WHERE T.k_id = 1 GROUP BY T.id

我的问题是:这可以通过查询构建器实现。或者更好......你能建议更简单的方法吗?感谢

1 个答案:

答案 0 :(得分:0)

我解决了这个问题"很难"如果有人有类似的问题:

$options['join'][] = [
    'type' => 'LEFT',
    'table' => '(t_values T_Values' . $id . ' INNER JOIN values Values' . $id . ' ON Values' . $id . '.id = T_Values' . $id . '.value_id AND Values' . $id . '.v_id = ' . $id . ')',
    'conditions' => ['T_Values' . $id . '.t_id = T.id']
];