あなたはSQL側でそれを解決することを試みることができます。ただし、そのクレイジーなクエリを動的に作成するには、PHPを使用する必要があります。さらに悪いことに、SQLでプログラムコードを記述します。 PHPでの後処理は非常に簡単ですが、
// $row = DB::..
$row = (object)[ // result from DB
'field1' => 'value1',
'field2' => null,
'field3' => 'value3'
];
foreach (get_object_vars($row) as $key => $val) {
if ($val === null) {
unset($row->{$key});
}
}
これは事実上、3行の非常に単純なコードです。 var_export($row)
の結果 :
stdClass::__set_state(array(
'field1' => 'value1',
'field3' => 'value3',
))
ご覧のとおり、NULLのフィールドは削除されています。
さらに良い方法:クエリをシンプルに保ち、test2
を選択するだけです IF(test2 = "myText" , test2, FALSE) AS test2_Alias
の代わりに 。次に、「動的に」test2_Alias
を作成します 必要に応じて:
if ($row->test2 == 'myText') {
$row->test2_Alias = $row->test2;
}
はい-それは退屈です。特別なことは何もありません。しかし、いくつかのバグを修正しようとすると、単純なコードが気に入るはずです。
更新
チャットから:
「特定の値」が$specificValue
に保存されていると仮定します 。
$row = DB::('example')->select('test1, test2, test3')->first();
if ($row->test2 != $specificValue) {
unset($row->test2, $row->test3);
}
それでおしまい。私見では、次のような2つのクエリを実行するよりも優れています。
$test2 = DB::('example')->value('test2');
$select = ($test2 == $specificValue)
? 'test1, test2, test3'
: 'test1';
$row = DB::('example')->select($select)->first();