首页 文章

Laravel Fluent Queries - 如何使用Fluent执行'SELECT AS'?

提问于
浏览
21

我对Laravel和Fluent的查询很新 . 我有一个查询来从hire表中选择所有行并以随机顺序显示它们 .

DB::table('hire_bikes')->order_by(\DB::raw('RAND()'))->get();

我现在想做的就是放

concat(SUBSTRING_INDEX(description, " ",25),"...") AS description

进入查询的SELECT部分,这样我就可以从表中选择*和缩短的描述 .

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

任何帮助或想法?

谢谢亚当 .

3 回答

  • 22

    您可以通过在流畅查询中向选择数组添加 DB::raw() 来实现此目的 . 我在本地进行了测试,效果很好 .

    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();
    
  • 0

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

    $event = Events::select(['name AS title', 'description AS content'])->first();
    
    // Or just pass multiple params
    
    $event = Events::select('name AS title', 'description AS Content');
    
    $event->title;
    $event->content;
    

    刚刚测试过 .

    EDIT:

    另外,我建议不要使用 DB:raw() 查询来执行描述字段的连接 . 如果您正在使用雄辩的模型,您可以使用accessors & mutatators为您执行此操作,因此如果您需要有限的描述,您只需在视图中输出它,而不必每次都使用相同的查询来获得有限的描述 . 例如:

    class Book extends Eloquent
    {   
        public function getLimitedDescriptionAttribute()
        {
            return str_limit($this->attributes['description'], $limit = 100, $end = '...');
        }
    }
    

    在你看来:

    @foreach($books as $book)
    
        {{ $book->limited_description }}
    
    @endforeach
    

    示例输出(不准确限制):

    The description of this book is...
    

    EDIT #2:

    我还建议不要使用数据库外观,因为它总是使用您的默认连接 . 如果您要查询辅助连接,除非您使用以下方法主动指定,否则不会考虑此问题:

    DB::connection('secondary')->table('hire_bikes')->select(['name as title'])->get();
    
  • 24
    select(array(DB::raw('latitude as lat'), DB::raw('longitude as lon')))
    

相关问题