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

ada*_*ley 22 mysql fluent laravel

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

DB::table('hire_bikes')->order_by(\DB::raw('RAND()'))->get();
Run Code Online (Sandbox Code Playgroud)

我现在想做的就是放

concat(SUBSTRING_INDEX(description, " ",25),"...") AS description
Run Code Online (Sandbox Code Playgroud)

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

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

任何帮助或想法?

谢谢亚当.

Ste*_*man 30

您可以实际使用select AS而不使用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;
Run Code Online (Sandbox Code Playgroud)

刚刚测试过.

编辑:

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

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

在你看来:

@foreach($books as $book)

    {{ $book->limited_description }}

@endforeach
Run Code Online (Sandbox Code Playgroud)

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

The description of this book is...
Run Code Online (Sandbox Code Playgroud)

编辑#2:

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

DB::connection('secondary')->table('hire_bikes')->select(['name as title'])->get();
Run Code Online (Sandbox Code Playgroud)

  • 你甚至不必使用数组.只需将其作为参数传递,如:`Car :: select('brand_name AS brand','color','horsepower AS hp') - > first();`.你可以这样做,因为在`select`中检索函数参数(`$ columns`)是这样做的:`$ this-> columns = is_array($ columns)?$ columns:func_get_args();`. (3认同)

Ale*_*spo 23

您可以通过DB::raw()在fluent查询中添加一个select数组来完成此操作.我在本地进行了测试,效果很好.

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();
Run Code Online (Sandbox Code Playgroud)