【问题标题】:Laravel Fluent queries - How do I perform a 'SELECT AS' using Fluent?Laravel Fluent 查询 - 如何使用 Fluent 执行“SELECT AS”?
【发布时间】:2013-01-05 20:44:45
【问题描述】:

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

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

我现在希望能够放

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

进入查询的SELECT部分​​,这样我就可以从表中select *得到一个简短的描述。

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

我该怎么做?

【问题讨论】:

  • 我之后的原始等价物是DB::query('SELECT title, url, image, concat(SUBSTRING_INDEX(description, " ",25),"...") AS description, category FROM hire_bikes ORDER BY RAND()');
  • 您可以编辑您的问题。 ;) 顺便说一句,通常您在模型中执行此类逻辑,否则您将失去使用 fluent(与 DBMS 无关)的好处,您可以首先进行原始查询,从而节省您的时间。
  • 它是一个查询,我只需要在一个页面上运行,所以不需要它在模型中,它没有连接或依赖等......我知道它很容易通过原始查询完成同样快,我只是希望了解更多有关 Fluent 方法的信息,看看是否可以选择多个列而不选择所有列。 Fluent 似乎只允许您拥有 1 列或所有列,这太可惜了!
  • 当然你可以选择特定的列->get(array('id', 'email as user_email'));,但是你的问题似乎是关于在你的查询中使用函数(可以是特定于DBMS),这是完全不同的。

标签: mysql laravel fluent


【解决方案1】:

您实际上可以使用 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() 查询来执行描述字段的连接。如果您使用的是 eloquent 模型,您可以使用 accessors and mutators 为您执行此操作,因此如果您需要有限的描述,您可以简单地将其输出到您的视图中,而不必每次都使用相同的查询来获得有限的描述。例如:

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 外观,因为它总是使用您的默认连接。如果您正在查询辅助连接,除非您使用以下方式主动指定它,否则它不会考虑到这一点:

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

请注意,如果您使用选择 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.

【讨论】:

  • 这应该被授予答案,建议一个不涉及 raw() 的解决方案
  • 您甚至不必使用数组。只需将其作为参数传递,例如:Car::select('brand_name AS brand', 'colour', 'horsepower AS hp')->first();。您可以这样做,因为在 select 中检索函数参数 ($columns) 是这样完成的:$this->columns = is_array($columns) ? $columns : func_get_args();
  • 感谢@totymedli,我已将此添加到答案中。
【解决方案2】:

您可以通过将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();

【讨论】:

    【解决方案3】:
    select(array(DB::raw('latitude as lat'), DB::raw('longitude as lon')))
    

    【讨论】:

      猜你喜欢
      • 2019-04-01
      • 2013-07-09
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      • 2018-06-24
      • 2020-12-06
      相关资源
      最近更新 更多