web-dev-qa-db-fra.com

Laravel Requêtes Fluent - Comment puis-je effectuer un 'SELECT AS' en utilisant Fluent?

Je suis assez nouveau dans les requêtes Laravel et Fluent ..__J'ai une requête pour sélectionner toutes les lignes de la table de location et les afficher dans un ordre aléatoire.

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

Je veux maintenant pouvoir faire est de mettre 

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

dans la partie SELECT de la requête, afin que je puisse sélectionner * de la table et une description abrégée.

Je sais que cela est possible en exécutant une requête brute, mais j'espérais pouvoir le faire en utilisant Fluent ou au moins en partie Fluent (comme ci-dessus).

Toute aide ou idées?

Merci Adam.

21
adam Kearsley

Vous pouvez le faire en ajoutant un DB::raw() à un tableau sélectionné dans votre requête courante. J'ai testé cela localement et cela fonctionne bien.

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();
22
Alex Naspo

Vous pouvez réellement utiliser select AS sans utiliser DB::raw(). Il suffit de passer un tableau dans la méthode select() comme ceci:

$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;

Testé tout à l'heure.

MODIFIER:

Nous vous suggérons également de ne pas utiliser une requête DB:raw() pour effectuer un concaténage de votre champ de description. Si vous utilisez un modèle éloquent, vous pouvez utiliser accessors & mutatators pour l'exécuter à votre place. Si vous avez besoin d'une description limitée, vous pouvez simplement l'afficher dans votre affichage sans avoir à utiliser la même requête à chaque fois pour obtenir une description limitée. Par exemple:

class Book extends Eloquent
{   
    public function getLimitedDescriptionAttribute()
    {
        return str_limit($this->attributes['description'], $limit = 100, $end = '...');
    }
}

A votre avis:

@foreach($books as $book)

    {{ $book->limited_description }}

@endforeach

Exemple de sortie (non précis pour limiter):

The description of this book is...

EDIT # 2:

Je vous déconseille également d'utiliser la façade de base de données, car elle utilise toujours votre connexion par défaut. Si vous interrogez une connexion secondaire, cela ne sera pris en compte que si vous le spécifiez activement à l'aide de:

DB::connection('secondary')->table('hire_bikes')->select(['name as title'])->get();
24
Steve Bauman
select(array(DB::raw('latitude as lat'), DB::raw('longitude as lon')))
0
malhal