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

时间:2013-01-22 15:05:16

标签: mysql laravel fluent

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

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

我现在希望能够做到的是

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

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

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

任何帮助或想法?

由于 亚当。

3 个答案:

答案 0 :(得分:27)

您实际上可以在不使用AS的情况下使用select DB::raw()。只需将数组传入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;

刚刚测试过。

修改

另外,我建议不要使用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...

编辑#2:

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

DB::connection('secondary')->table('hire_bikes')->select(['name as title'])->get();

编辑#3:

请注意,如果您使用选择AS(name AS title)并且希望更新模型,则仍需设置与数据库列一致的正确属性名称。

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

$event = Events::select('name AS title')->first();

$event->title = 'New name';

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

答案 1 :(得分:23)

您可以通过向您的流畅查询中的select数组添加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();

答案 2 :(得分:0)

select(array(DB::raw('latitude as lat'), DB::raw('longitude as lon')))