首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel Fluent查询-如何使用Fluent执行'SELECT AS‘?

Laravel Fluent查询-如何使用Fluent执行'SELECT AS‘?
EN

Stack Overflow用户
提问于 2013-01-22 23:05:16
回答 3查看 34.6K关注 0票数 23

我有一个查询,用于从hire表中选择所有行,并以随机顺序显示它们。

代码语言:javascript
复制
DB::table('hire_bikes')->order_by(\DB::raw('RAND()'))->get();

我现在希望能够把

代码语言:javascript
复制
concat(SUBSTRING_INDEX(description, " ",25), "...") AS description

放入查询的SELECT部分,这样我就可以从表和简短的描述中select *

我知道这可以通过运行原始查询来实现,但我希望能够使用Fluent或至少部分Fluent (如上所述)来实现这一点。

我该怎么做呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-24 21:11:19

您可以通过将DB::raw()添加到fluent查询中的select an数组来完成此操作。我在本地测试了它,它工作得很好。

代码语言:javascript
复制
DB::table('hire_bikes')
  ->select(
      array(
        'title',
        'url',
        'image',
        DB::raw('concat(SUBSTRING_INDEX(description, " ",25),"...") AS description'),
        'category'
      )
    )
  ->order_by(\DB::raw('RAND()'))
  ->get();
票数 23
EN

Stack Overflow用户

发布于 2014-09-08 22:13:32

您实际上可以在不使用DB::raw()的情况下使用select AS。只需将一个数组传入select()方法,如下所示:

代码语言:javascript
复制
$event = Events::select(['name AS title', 'description AS content'])->first();

// Or just pass multiple parameters

$event = Events::select('name AS title', 'description AS Content');

$event->title;
$event->content;

我测试过了。

另外,我建议不要使用DB:raw()查询来执行描述字段的连接。如果您使用的是eloquent模型,则可以使用accessors and mutators为您执行此操作,因此,如果您需要有限的描述,您可以简单地在视图中输出它,而不必每次都使用相同的查询来获取有限的描述。例如:

代码语言:javascript
复制
class Book extends Eloquent
{
    public function getLimitedDescriptionAttribute()
    {
        return str_limit($this->attributes['description'], $limit = 100, $end = '...');
    }
}

在您的视图中:

代码语言:javascript
复制
@foreach($books as $book)

    {{ $book->limited_description }}

@endforeach

示例输出(不精确到限制):

代码语言:javascript
复制
The description of this book is...

我还建议不要使用DB facade,因为它总是使用您的默认连接。如果您正在查询辅助连接,它不会考虑这一点,除非您使用以下命令主动指定它:

代码语言:javascript
复制
DB::connection('secondary')->table('hire_bikes')->select(['name as title'])->get();

仅需注意,如果使用select AS (name AS title)并希望更新模型,则仍必须设置与数据库列一致的正确属性名。

例如,这将导致异常,因为数据库表中不存在title列:

代码语言:javascript
复制
$event = Events::select('name AS title')->first();

$event->title = 'New name';

$event->save(); // Generates exception, 'title' column does not exist.
票数 36
EN

Stack Overflow用户

发布于 2014-09-03 17:53:42

代码语言:javascript
复制
select(array(DB::raw('latitude as lat'), DB::raw('longitude as lon')))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14461623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档