如何在 Laravel Query Builder 中执行 TRIM() 和 CONCAT()?

Posted

技术标签:

【中文标题】如何在 Laravel Query Builder 中执行 TRIM() 和 CONCAT()?【英文标题】:How to perform TRIM() and CONCAT() in Laravel Query Builder? 【发布时间】:2019-08-14 14:15:39 【问题描述】:

我尝试将 FirstName、middlename、Lastname 与 RAW 结合使用查询生成器,但失败了。我的方法错了吗?谢谢

$student = \DB::table('student')
                        ->select(DB::raw('RTRIM(LTRIM(CONCAT(
                                          COALESCE(FirstName +  ''),
                                        COALESCE(MiddleName +  ''),
                                        COALESCE(Lastname, ''))))
                                        AS Name'))
                        ->get();

【问题讨论】:

COALESCE(FirstName + '') 似乎无效 你不使用 Eloquent 模型有什么原因吗? 【参考方案1】:
$student = DB::table('student')
    ->select(
        DB::raw("TRIM(CONCAT(FirstName,' ',MiddleName,' ',LastName)) AS Name")
    )->get();

TRIM 功能 - 删除字符串See examples and how to use it的前导和尾随空格

CONCAT 功能 - 使用 逗号 将多个字符串相加:See examples and how to use it

希望能帮到你:)

【讨论】:

【参考方案2】:

试试这个:

$student = \DB::table('student')
               ->select(\DB::raw('CONCAT_WS(" ", `FirstName`, `MiddleName`, `Lastname`) as Name'))
               ->get();

【讨论】:

【参考方案3】:

+ 符号应该是逗号:

$student = \DB::table('student')
    ->selectRaw("TRIM(CONCAT(COALESCE(FirstName,  ''), COALESCE(MiddleName,  ''), COALESCE(Lastname, ''))) AS Name")
    ->get();

【讨论】:

【参考方案4】:

为什么不使用 Laravel 模型来实现这一点?

class Student extends Model 

     protected $appends = 'full_name';

     public function getFullNameAttribute() 
         return $this->FirstName . ' ' . $this->MiddleName . ' ' . $this->LastName; 
     

然后,Student::get() 将为每个学生拥有full_name 属性。

【讨论】:

好吧,你可以使用 Eloquent 来做这件事,但它们不是。所以我不确定在查询构建器上使用 ORM 是否真的是一个答案。 @Devon 这是一个非常好的答案,除非来自 OP 的“我不能因为 使用 Eloquent”。

以上是关于如何在 Laravel Query Builder 中执行 TRIM() 和 CONCAT()?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Laravel Eloquent 和 Laravel Query Builder 进行联合查询?

如何在 Laravel Query Builder 中执行 TRIM() 和 CONCAT()?

如何在 Laravel 4.2 中创建自定义 DB Query Builder 方法

Laravel Query builder,如何让 1 领先于哪里,另一个领先于哪里?

如何在 Laravel Query Builder 中使用全局作用域? (没有雄辩的模型)

如何将此 SQL 转换为 Laravel Query Builder 查询?