Mysql Laravel Fluent查询-如何使用Fluent执行“选择为”?

Mysql Laravel Fluent查询-如何使用Fluent执行“选择为”?,mysql,laravel,fluent,Mysql,Laravel,Fluent,我有一个查询来选择hire表中的所有行,并以随机顺序显示它们 DB::table('hire_bikes')->order_by(\DB::raw('RAND()'))->get(); 我现在想能够把 concat(SUBSTRING_INDEX(description, " ",25), "...") AS description 进入查询的SELECT部分,以便我可以从表中选择*和一个简短的描述 我知道通过运行一个原始查询可以做到这一点

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

DB::table('hire_bikes')->order_by(\DB::raw('RAND()'))->get();
我现在想能够把

concat(SUBSTRING_INDEX(description, " ",25), "...") AS description
进入查询的SELECT部分,以便我可以从表中选择*和一个简短的描述

我知道通过运行一个原始查询可以做到这一点,但我希望能够使用Fluent或者至少像上面那样的部分Fluent来做到这一点


如何操作?

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

实际上,您可以使用select AS而不使用DB::raw。只需将数组传入select方法,如下所示:

$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查询来连接描述字段。如果您使用的是雄辩的模型,您可以使用来执行此操作,因此如果您需要有限的描述,您可以简单地在视图中输出它,而不必每次都使用相同的查询来获得有限的描述。例如:

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...
我还建议不要使用DB facade,因为它总是使用默认连接。如果您正在查询辅助连接,则不会考虑此问题,除非您使用以下方式主动指定:

DB::connection('secondary')->table('hire_bikes')->select(['name as title'])->get();
需要注意的是,如果使用select AS名称作为标题,并且希望更新模型,则仍然需要设置与数据库列一致的正确属性名称

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

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

$event->title = 'New name';

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

im所追求的原始等价物是DB::query'SELECT title、url、image、concatSUBSTRING\u INDEXdescription、、25、,。。。如描述所示,分类来自兰德公司的出租自行车订单;你可以编辑你的问题;顺便说一句,通常你在模型中执行这种逻辑,否则你就失去了使用fluent的好处,因为它与DBMS无关,你可以首先进行原始查询,节省时间。我只需要在一个页面上运行这个查询,所以不需要在模型中运行,它没有连接或依赖关系等。。。我知道通过一个原始查询就可以很容易地完成这项工作,我只是希望了解更多关于Fluent方法的知识,看看是否可以选择多个列而不选择所有列。Fluent只会让你拥有一列或所有列,这是一种耻辱!当然,您可以选择特定的列,但是您的问题似乎是关于在查询中使用特定于DBMS的函数,这是完全不同的。这应该得到答案,因为建议一个不涉及RAW的解决方案,您甚至不必使用数组。只需将其作为参数传递,如:Car::选择'brand_name as brand','color','horsepower as hp'->first;。之所以可以这样做,是因为在select中检索函数参数$columns是这样做的:$this->columns=is\u array$columns$列:func\u get\u args;。谢谢@totymedli,我已经将此添加到了答案中。
$event = Events::select('name AS title')->first();

$event->title = 'New name';

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