如何使用 Laravel 4 Eloquent 连接列?

Posted

技术标签:

【中文标题】如何使用 Laravel 4 Eloquent 连接列?【英文标题】:How to concatenate columns with Laravel 4 Eloquent? 【发布时间】:2014-03-27 08:08:12 【问题描述】:

我有一个名为 tenantdetails 的表,其中包含

Tenant_Id | First_Name | Last_Name | ........

我想通过 mysql 的连接函数将 First_NameLast Name 检索为一列。所以我写在我的controller如下

$tenants = Tenant::orderBy('First_Name')->lists('CONCAT(`First_Name`," ",`Last_Name`)','Tenant_Id');

但结果如下错误:

 SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error 
 in your SQL syntax; check the manual that corresponds to your MySQL server
 version for the right syntax to use near '`," ",`First_Name`)`, 
 `Id` from `tenantdetails` order by `F' at line 1 

 (SQL: select `CONCAT(`First_Name`," ",`Last_Name`)`, `Id` 
 from `tenantdetails` order by `First_Name` asc).

在 Laravel Eloquent 中调用 MySQL 的函数时如何避免反引号。我只对 Eloquent 感兴趣(对流利的查询不感兴趣)。提前致谢。

更新

感谢@Andreyco 帮助我。我们可以使用 Laravel 模型以更优雅的方式实现这一点,如下所示:

在我们的model

public function getTenantFullNameAttribute()

    return $this->attributes['First_Name'] .' '. $this->attributes['Last_Name'];

在我们的controller:

$tenants = Tenant::orderBy('First_Name')->get();
$tenants = $tenants->lists('TenantFullName', 'Tenant_Id');

【问题讨论】:

这个模型解决方案很棒。这在文档中的任何地方吗? @Kyle Ridolfo。谢谢。实际上我忘记了解决方案的来源。但我确信直到我搜索解决方案的那一天才出现在文档中。 如果还有人感兴趣,文档在这里:laravel.com/docs/8.x/eloquent-mutators#accessors-and-mutators(这里指向最新的 Laravel 版本,你需要查看你项目中使用的版本)。 【参考方案1】:
Tenant::select('Tenant_Id', DB::raw('CONCAT(First_Name, " ", Last_Name) AS full_name'))
    ->orderBy('First_Name')
    ->lists('full_name', 'Tenant_Id');

【讨论】:

只有雄辩的 orm 才有可能做到这一点 我是 laravel 的初学者。我认为它是 Fluent Query Builder 和 Eloquent 的结合。我错了吗? 谢谢,这对我来说已经足够了。我只是想知道我们是否只能通过雄辩来做到这一点(因为现在我正在学习过程中)。感谢您的帮助.. 在 Laravel 5 中你必须要么 use DB; 要么用反斜杠调用它:\DB::raw... @manuthalasseril 我采用了@michel-ayres 建议的selectRaw 方法,但将其放入查询范围(laravel.com/docs/4.2/eloquent#query-scopes) 以方便重复使用...让它看起来更“雄辩”:)【参考方案2】:

一个简单的方法是使用selectRaw。它是由 Tailor 在Jan 30, 2014实现的

Source

Tenant::selectRaw('CONCAT(First_Name, " ", Last_Name) as TenantFullName, id')->orderBy('First_Name')->lists('TenantFullName', 'id'))

【讨论】:

【参考方案3】:

lists() 方法用于从选定结果中选择列。所以首先联系名字和姓氏,并在选择语句中为该列提供新的别名

 $tenants = Tenant::orderBy('First_Name')->select(DB::row('CONCAT(`First_Name`," ",`Last_Name`) as name'),'Tenant_Id')->lists('name', 'id');

那么你可以在 lists() 方法中选择这个别名

【讨论】:

只是一个关于拼写错误 DB::row 应该是 DB::raw 的注释,您可能需要编辑您的答案。【参考方案4】:

你应该使用 DB::raw() 来连接那些字段

Tenant::select(
          'Tenant_Id',
          DB::raw('CONCAT(First_Name,"-",Last_Name) as full_name')

        )
       ->orderBy('First_Name')
       ->lists('full_name', 'Tenant_Id');

【讨论】:

【参考方案5】:

您也可以使用查询生成器来执行此操作 喜欢:

DB::table('Tenant')
->selectRaw('CONCAT(First_Name, " - ", Last_Name) as fullName, id')
->get();

希望对你有所帮助:)

【讨论】:

以上是关于如何使用 Laravel 4 Eloquent 连接列?的主要内容,如果未能解决你的问题,请参考以下文章

Payum - Laravel 4 的包。如何使用 Eloquent 而不是 FilesystemStorage 创建模型数据?

Laravel 4:如何使用 Eloquent ORM“排序”[重复]

如何在 Laravel 4 中手动创建一个新的空 Eloquent 集合

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

Laravel 4.2 Eloquent 获取特定用户和特定角色

Laravel 4:如何将 WHERE 条件应用于 Eloquent 类的所有查询?