Laravel Fluent Queries - Как выполнить «SELECT AS» с использованием Fluent?

17

Я довольно новичок в вопросах Laravel и Fluent. У меня есть запрос, чтобы выбрать все строки из таблицы найма и отобразить их в произвольном порядке.

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

Теперь я хочу, чтобы это было сделано, это положить

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

в SELECT-часть запроса, чтобы я мог выбрать * из таблицы и сокращенное описание.

Я знаю, что это возможно, запустив необработанный запрос, но я надеялся, что смогу сделать это с помощью Fluent или, по крайней мере, частичного Fluent (например, выше).

Любая помощь или идеи?

Спасибо Адам.

    
задан adam Kearsley 22.01.2013 в 16:05
источник

3 ответа

20

Вы можете сделать это, добавив 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();
    
ответ дан Alex Naspo 24.01.2013 в 14:11
источник
19

Фактически вы можете использовать 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;

Протестировано только сейчас.

EDIT:

Также я предлагаю не использовать запрос DB:raw() для выполнения concat вашего поля описания. Если вы используете красноречивую модель, вы можете использовать accessors & amp; мутаторы , чтобы выполнить это для вас, поэтому, если вам когда-либо понадобится ограниченное описание, вы можете просто вывести его в своем представлении и не использовать один и тот же запрос каждый раз, чтобы получить ограниченное описание. Например:

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();
    
ответ дан Steve Bauman 08.09.2014 в 16:13
источник
0
select(array(DB::raw('latitude as lat'), DB::raw('longitude as lon')))
    
ответ дан malhal 03.09.2014 в 11:53
источник