根据列值动态选择列

时间:2019-03-04 09:43:51

标签: php mysql laravel

您好,感谢您抽出时间来回答我的问题。

我正在尝试使用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字段的值来选择更多列或从输出中排除它们。

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;