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

19

Я довольно новичок в вопросах 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
источник
  • Исходный эквивалент того, что im после DB :: query ('SELECT title, url, image, concat (SUBSTRING_INDEX (описание, "", 25), "...") AS description, category FROM hire_bikes ORDER BY RAND () '); –  adam Kearsley 22.01.2013 в 16:10
  • Вы можете отредактировать свой вопрос. ;) Кстати, обычно вы делаете такую ​​логику в модели, иначе вы теряете выгоду от использования свободного (будучи агностиком DBMS), и вы можете в первую очередь пойти на необработанный запрос, сохранив время. –  dualed 22.01.2013 в 16:14
  • Его запрос мне нужно всего лишь запустить на одной странице, поэтому нет необходимости в том, чтобы он был в модели, у него нет объединений или зависимостей и т. д. Я знаю, что его легко сделать с помощью необработанного запроса и так же быстро, я просто надеялся узнать больше о Fluent-методах и посмотреть, можно ли выбрать несколько столбцов, не выбирая их все. Только Fluent показывает, что у вас есть 1 столбец ИЛИ все столбцы, что является позором! –  adam Kearsley 22.01.2013 в 16:17
  • Конечно, вы можете выбрать определенные столбцы -> get (array ('id', 'email as user_email')); однако ваш вопрос, похоже, связан с использованием функций (которые могут быть специфичными для СУБД) в вашем запросе, это нечто совершенно другое. –  dualed 22.01.2013 в 16:23

3 ответа

21

Вы можете сделать это, добавив 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
источник
  • Менее элегантно, чем Стивс отвечает :) –  S.. 23.11.2014 в 00:07
22

Фактически вы можете использовать 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
источник
  • Этому должен был быть предоставлен ответ, для предложения решение, которое не включает raw () –  Mawg 28.01.2015 в 15:03
  • Вам даже не нужно использовать массив. Просто передайте его как параметр: Car :: select ('brand_name AS brand', 'color', 'horsepower AS hp') -> first () ;. Вы можете это сделать, потому что извлечение параметров функции ($ columns) в select выполняется следующим образом: $ this-> columns = is_array ($ columns)? $ columns: func_get_args () ;. –  totymedli 25.09.2015 в 16:09
  • Спасибо @totymedli, я добавил это к ответу. –  Steve Bauman 28.09.2015 в 15:24
0
select(array(DB::raw('latitude as lat'), DB::raw('longitude as lon')))
    
ответ дан malhal 03.09.2014 в 11:53
источник