この種のCOALESCE()
文をクエリビルダに書き込むにはどうすればよいですか?CakePHP 3 - クエリビルダーでCOALESCE(...)を書くには?
SQL
SELECT COALESCE(n.value, p.value) AS value
FROM nodes n
LEFT JOIN parents p ON p.id = n.parent_id
PHP
私は子供と親の両方の値を取得し、結果セットを通過し、ちょうど子供1が空の場合、親のいずれかを使用することができ、クエリ自体にそれを組み込むよりエレガントな方法があれば、私はそれを好むでしょう。
$child = $this->Nodes->find()
->select(['id', 'value'])
->where(['Nodes.id' => $id])
->contain([
'Parents' => function ($q) {
return $q->select('value');
}
])
->first();
if (empty($child->value)) {
$child->value = $child->parent->value;
}
アップデート1
だから、これは私が現時点で持っているものですが、それは動作しません。
$child = $this->Nodes->find()
->select(['id', 'value'])
->where(['Nodes.id' => $id])
->contain([
'Parents' => function ($q) {
return $q->select([
'value' => $q->func()->coalesce([
'Nodes.value',
'Parents.value'
])
]);
}
])
->first();
戻り値:
object(Cake\ORM\Entity) {
'id' => (int) 234,
'value' => (float) 0,
'[new]' => false,
'[accessible]' => [
'*' => true
],
'[dirty]' => [],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[invalid]' => [],
'[repository]' => 'Nodes'
}
子値がNULL
で、親の値が1.00
ので、私は、エンティティの値は'value' => (float) 1.00
ことを期待しているが、私はそれがに変換FALSE
としてクエリから出てくるだと仮定(float) 0
。
アップデート2
これは、通常のフィールドが動作しないよう、既に存在する名前に合体をエイリアシングようです。合体結果に固有のフィールド名が必要です。
アップデート3
私は別のテストを行なったし、代わりに2つのテーブルのname
フィールドを選択し、それはちょうど私が(彼らはカラム名として評価されません)機能に入力された実際の文字列を返します。
return $q->select([
'value' => $q->func()->coalesce([
'Nodes.name',
'Parents.name'
])
]);
返されるエンティティはあります
'value' => 'Nodes.name'
だから私の新しいquestio nは、テーブル/フィールド名として文字列を評価するクエリビルダを取得する方法ですか?
は注意 – rjdown
COALESCEもORMによってサポートされています:http ://api.cakephp.org/3.3/class-Cake.Database.FunctionsBuilder.html#_coalesce – burzum
@rjdownありがとう、私は質問を更新しました。 – BadHorsie