使用 Laravel 4 Eloquent 连接列上的列名“”无效?
Posted
技术标签:
【中文标题】使用 Laravel 4 Eloquent 连接列上的列名“”无效?【英文标题】:Invalid column name ' ' on concatenate columns with Laravel 4 Eloquent? 【发布时间】:2015-03-22 17:03:24 【问题描述】:所以我想准备一个列表放入 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 Driver 11 for SQL Server][SQL Server]Invalid column name ' ' (所以我猜测与示例不同在其他地方给出的,这些分隔被读取就好像它们是列一样?)那么我怎样才能与某种分隔连接呢?
【问题讨论】:
能否尝试切换引号,让 SQL 语句使用单引号:DB::raw("CONCAT(DESC,' ',OS,' ',OS_V) AS FullDesc")
?
【参考方案1】:
我使用 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
以供以后使用。
希望这会奏效。
【讨论】:
如果没有,它不会与 CONCAT(DESC, OS, OS_V) AS FullDesc') 一起工作,但它确实很好,它显示了连接的列就像我说的。我只是想为了更好的展示目的也做一个分离,比如反冲、下划线、空格或其他东西 但是您遇到了 SQL 错误,不是吗?现在我很困惑:P 我是,但仅当我尝试添加分隔符时 **('CONCAT(DESC," ",OS," ",OS_V) AS FullDesc'), 'DEVI_ID') ** 哦,我明白了。我可以理解为什么 \ 会破坏它,因为那是一个转义字符。尝试检查查询的原始输出:$queries = DB::getQueryLog(); $last_query = end($queries); dd($last_query);
,看看它在做什么,也许你可以更好地理解它。
我没有在任何地方使用 \。这给了我登录查询。可能是因为这个失败所以没有录下来【参考方案2】:
如果您的 SQL Server 已打开 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
文档here。
【讨论】:
以上是关于使用 Laravel 4 Eloquent 连接列上的列名“”无效?的主要内容,如果未能解决你的问题,请参考以下文章
Laravel - 使用 Eloquent 从连接关系模型中选择特定列
在 Laravel Eloquent 中使用“with()”函数连接列
Laravel Eloquent - 使用连接选择列文本类似于其他表中的列文本
Laravel Eloquent:如何从连接表中仅获取某些列