CakePHP 3 使用查询构建器构建复杂连接
CakePHP 3 build complex join using query builder
我需要在同一个表上动态添加连接...像这样:
// 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
问题是未选择第二个值 - 它为空。这可以通过将第二个连接类型更改为 '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
我的问题是:这可以通过查询生成器来实现吗?或者更好……你能建议更简单的方法吗?谢谢
我用"hard"方法解决了,如果有人有类似问题:
$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']
];
我需要在同一个表上动态添加连接...像这样:
// 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
问题是未选择第二个值 - 它为空。这可以通过将第二个连接类型更改为 '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
我的问题是:这可以通过查询生成器来实现吗?或者更好……你能建议更简单的方法吗?谢谢
我用"hard"方法解决了,如果有人有类似问题:
$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']
];