使用 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:如何从连接表中仅获取某些列

如何在Laravel 4中使用Eloquent Model增加列

Laravel 4 中的 Eloquent 调用:处理多个表中的单个列