您好,感谢您抽出时间来回答我的问题。
我正在尝试使用laravel雄辩的模型创建条件if语句。
我的代码示例如下:
$query = DB::table('example')->select('test1',
DB::raw('IF(test2 = "myText" , test2, FALSE) AS test2_Alias'),
DB::raw('IF(test2 = "myText" , test3, FALSE) AS test3_Alias')
)->first();
条件正常,我可以检索结果,但我需要其他东西。有没有一种方法可以完全删除错误的语句,使我的列名根本不出现?
所以我的输出将是:
1 array field if `test2` text is not `myText` (test1)
3 array fields if `test2` test is `myText` (test1,test2,test3)
Case-when
对此也不起作用,因为那里仍然存在备用。
Union
也不适合我,因为我需要在select语句中使用相同数量的列,而这并不是我想要的,如上所述。
当然,作为最后一个解决方案,我总是可以检索所有列并在PHP端应用逻辑,但是我希望对我的问题可能有一个Mysql解决方案。
编辑以添加更多信息
我要实现的目标是基于1字段的值来选择更多列或从输出中排除它们。
答案 0 :(得分:1)
您可以尝试在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});
}
}
实际上是三行非常简单的代码。 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;
}
是的-很无聊。没有什么花哨。但是,当您尝试修复一些错误时,您会喜欢简单的代码。
从我们的聊天中:
test1,test2,test3是让我用我想要的代码更好地解释的列 拥有:
选择(test1)
select(test1,test2,test3),但第二个选择仅在以下情况下发生 test2具有特定值
假设您的“特定值”存储在$specificValue
中。
$row = DB::('example')->select('test1, test2, test3')->first();
if ($row->test2 != $specificValue) {
unset($row->test2, $row->test3);
}
就是这样。恕我直言,这比执行两个查询要好:
$test2 = DB::('example')->value('test2');
$select = ($test2 == $specificValue)
? 'test1, test2, test3'
: 'test1';
$row = DB::('example')->select($select)->first;