web-dev-qa-db-ja.com

Laravel Fluentクエリ-Fluentを使用して「SELECT AS」を実行するにはどうすればよいですか?

LaravelおよびFluentクエリは初めてです。採用テーブルからすべての行を選択し、それらをランダムな順序で表示するクエリがあります。

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

今できるようになりたい

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

クエリのSELECT部分​​に挿入すると、テーブルと短い説明から*を選択できます。

私はこれが生のクエリを実行することで可能であることを知っていますが、Fluentまたは少なくとも部分的なFluent(上記のように)を使用してこれを実行できることを望んでいました。

ヘルプやアイデアはありますか?

アダムに感謝します。

23
adam Kearsley

これを行うには、Fluentクエリの選択配列に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();
23
Alex Naspo

実際には、DB::raw()を使用せずにselect ASを使用できます。次のように配列を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;
_

たった今テストされました。

編集:

また、DB:raw()クエリを使用して説明フィールドの連結を実行しないことをお勧めします。雄弁なモデルを使用している場合、 accessors&mutatators を使用してこれを実行できるため、限られた説明が必要な場合は、ビューに出力するだけで同じものを使用する必要はありません毎回クエリを実行して、限定された説明を取得します。例えば:

_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...
_

EDIT#2:

DBファサードは常にデフォルトの接続を使用するため、DBファサードを使用しないこともお勧めします。セカンダリ接続をクエリしている場合、次を使用してアクティブに指定しない限り、これは考慮されません。

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

EDIT#3:

ただし、選択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.
_
32
Steve Bauman
select(array(DB::raw('latitude as lat'), DB::raw('longitude as lon')))
0
malhal