Недопустимое имя столбца в объединении столбцов с Laravel 4 Красноречиво?
Итак, я хочу подготовить список для размещения в выпадающем списке с помощью laravel, и я хотел использовать объединение, чтобы объединить значения 3 столбцов, и я могу добиться этого с помощью этого
public function deviList() {
return Device::select(DB::raw('CONCAT(DESC, OS, OS_V) AS FullDesc'), 'DEVI_ID')
->where('STATUS', 2)
->orderBy('DESC')
->lists('FullDesc', 'DEVI_ID');
}
Однако было бы лучше иметь пробел или косую черту, разделяющую значения столбцов, поэтому я сделал это так, как некоторые люди рекомендовали в некоторых других местах:
public function deviList() {
return Device::select(DB::raw('CONCAT(DESC," ",OS," ",OS_V) AS FullDesc'), 'DEVI_ID')
->where('STATUS', 2)
->orderBy('DESC')
->lists('FullDesc', 'DEVI_ID');
}
Однако я получаю сообщение об ошибке SQLSTATE[42S22]: [Microsoft][Драйвер ODBC 11 для SQL Server] [SQL Server] Недопустимое имя столбца '' (Таким образом, я предполагаю, что в отличие от примеров, приведенных в других местах, эти разделения читаются так, как если бы они были столбцами?) Так как же я могу соединиться с каким-то разделением?
2 answers
Если на вашем SQL-сервере включен параметр QUOTED_IDENTIFIER
, то для идентификации объектов будут использоваться двойные кавычки, а не строковые литералы. В этом случае " "
не будет строкой, представляющей пробел, это будет объект (столбец), представленный пробелом, которого не существует.
Попробуйте переключить кавычки в вашей инструкции SQL:
public function deviList() {
return Device::select(DB::raw("CONCAT(DESC,' ',OS,' ',OS_V) AS FullDesc"), 'DEVI_ID')
->where('STATUS', 2)
->orderBy('DESC')
->lists('FullDesc', 'DEVI_ID');
}
QUOTED_IDENTIFIER
документы здесь.
Прошло некоторое время с тех пор, как я работал с SQL Server, но, насколько я помню, функция CONCAT
недоступна. Вместо этого вы используете что-то вроде этого:
SELECT (COALESCE(col1, '') + '' + COALESCE(col2, '')) AS col3 FROM ...
Я думаю, вы можете использовать это как таковое, если ваш запрос:
public function deviList() {
return Device::select(DB::raw('(COALESCE(DESC, "") + " " + COALESCE(OS, "") + " " (COALESCE(OS_V, "")) AS FullDesc'), 'DEVI_ID')
->where('STATUS', 2)
->orderBy('DESC')
->lists('FullDesc', 'DEVI_ID');
}
К сожалению, у меня нет возможности проверить это, но то, что он должен сделать, это с помощью COALESCE()
проверить, является ли столбец нулевым, прежде чем объединять его с пробелом между ними, а затем псевдонимировать его как FullDesc
для использования позже.
Надеюсь, это сработает.