Подтвердить что ты не робот

Laravel Fluent Queries - Как выполнить "SELECT AS" с помощью Fluent?

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

Это можно сделать, добавив 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

Фактически вы можете использовать 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() для выполнения конкат вашего поля описания. Если вы используете красноречивую модель, вы можете использовать аксессоры и мутаторы, чтобы выполнить это для вас, поэтому, если вам когда-нибудь понадобится ограниченное описание, вы можете просто вывести его в свое мнение и не использовать один и тот же запрос каждый раз, чтобы получить ограниченное описание. Например:

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

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