Vous pouvez essayer de le résoudre côté SQL. Mais vous aurez toujours besoin d'utiliser PHP pour écrire cette requête folle de manière dynamique. Ou pire - Vous allez écrire du code de programme en SQL. Alors que le post-traitement en PHP est assez simple :
// $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});
}
}
Ce sont en fait trois lignes de code assez simple. Le résultat de var_export($row)
:
stdClass::__set_state(array(
'field1' => 'value1',
'field3' => 'value3',
))
Comme vous le voyez, le champ avec NULL est supprimé.
Encore mieux :gardez votre requête simple et sélectionnez simplement test2
au lieu de IF(test2 = "myText" , test2, FALSE) AS test2_Alias
. Et puis "dynamiquement" créer test2_Alias
si besoin :
if ($row->test2 == 'myText') {
$row->test2_Alias = $row->test2;
}
Oui - c'est ennuyeux. Rien d'extraordinaire. Mais vous allez adorer le code simple, lorsque vous essayez de corriger certains bugs.
Mettre à jour
Depuis notre chat :
En supposant que votre "valeur spécifique" est stockée dans $specificValue
.
$row = DB::('example')->select('test1, test2, test3')->first();
if ($row->test2 != $specificValue) {
unset($row->test2, $row->test3);
}
C'est ça. À mon humble avis, c'est mieux que d'exécuter deux requêtes comme :
$test2 = DB::('example')->value('test2');
$select = ($test2 == $specificValue)
? 'test1, test2, test3'
: 'test1';
$row = DB::('example')->select($select)->first();