2014-04-08 19 views
10

Ich versuche, eine Abfrage in meiner Laravel App zu machen, und ich möchte eine normale Struktur für meine Abfrage verwenden. Diese Klasse benutzt entweder Eloquent, also muss ich etwas finden, um eine Anfrage völlig roh zu machen.Wie kann ich rohe via Eloquent abfragen?

Könnte etwas wie Model::query($query); sein. Nur das funktioniert nicht.

Antwort

7

Verwendung DB::statement('your raw query here'). Hoffe das hilft.

+7

Dies wird einen booleschen Wert zurückgeben, wenn die Anweisung ein select ist, für select -Klauseln verwenden Sie DB :: select, um ein Array von unformatierten Ergebnissen zu erhalten. – Lucia

+5

Sie sollten DB :: Anweisung nur verwenden, wenn Sie keine Ausgabe der Abfrage erwarten. – Fusion

26

Sie können dies versuchen:

// query can't be select * from table where 
Model::select(DB::raw('query'))->get(); 

Ein Beispiel:

Model::select(DB::raw('query')) 
    ->whereNull('deleted_at') 
    ->orderBy('id') 
    ->get(); 

Auch Sie so etwas wie dieses (mit Query Builder) verwenden können:

$users = DB::table('users') 
       ->select(DB::raw('count(*) as user_count, status')) 
       ->where('status', '<>', 1) 
       ->groupBy('status') 
       ->get(); 

Auch Sie kann etwas wie dieses versuchen (Using Query Builder):

$users = DB::select('select * from users where id = ?', array(1)); 
$users = DB::select(DB::raw("select * from users where username = :username"), array('username' => Input::get("username"))); 

Überprüfen Sie mehr über Raw-Expressions auf Laravel website.

+0

Dies scheint nicht für eine vollständige Abfrage zu arbeiten. Und ich benutze das beredte Ding, nicht die DB. Spielt das eine Rolle? – Chilion

+0

Auf 'Eloquent' können Sie keine vollständige rohe Abfrage verwenden, aber Sie können alle Methoden von' Query Builder' mit 'Eloquent' verwenden. –

+1

'DB verwenden;' wenn DB nicht gefunden wird –

6

Ich glaube nicht, dass Sie standardmäßig können. Ich habe Eloquent erweitert und die folgende Methode hinzugefügt.

/** 
* Creates models from the raw results (it does not check the fillable attributes and so on) 
* @param array $rawResult 
* @return Collection 
*/ 
public static function modelsFromRawResults($rawResult = []) 
{ 
    $objects = []; 

    foreach($rawResult as $result) 
    { 
     $object = new static(); 

     $object->setRawAttributes((array)$result, true); 

     $objects[] = $object; 
    } 

    return new Collection($objects); 
} 

Anschließend können Sie etwas tun:

class User extends Elegant { // Elegant is my extension of Eloquent 

    public static function getWithSuperFancyQuery() 
    { 
     $result = DB::raw('super fancy query here, make sure you have the correct columns'); 
     return static::modelsFromRawResults($result); 
    } 
} 
+0

Hallo, es hat mich geklappt, als $ result = DB :: select ('super fancy Abfrage hier, stellen Sie sicher, dass Sie die richtigen Spalten haben'); In Laravel 5.5 – Yilmazerhakan

0

Sie Ihr Ergebnis Handhabung

$objects = new Collection(array_map(function($entry) { 
    return (new static())->setRawAttributes((array) $entry, true); 
}, $result)); 
0

Alte Frage durch das Schreiben verkürzen können, bereits beantwortet, ich weiß.

Allerdings scheint niemand die Ausdrucksklasse zu erwähnen.

Zugegeben, das behebt möglicherweise Ihr Problem nicht, da Ihre Frage nicht eindeutig ist, wo in der SQL die Raw-Bedingung enthalten sein muss (in der SELECT-Anweisung oder in der WHERE-Anweisung?). Diese Information könnte Sie jedoch unabhängig davon nützlich finden.

Fügen Sie die folgende Klasse in Ihrer Modelldatei:

use Illuminate\Database\Query\Expression; 

in der Modellklasse Dann

protected $select_cols = [ 
    'id', 'name', 'foo', 'bar', 
    Expression ('(select count(1) from sub_table where sub_table.x = top_table.x) as my_raw_col'), 'blah' 
] 

eine neue Variable definieren und einen Rahmen hinzufügen:

public function scopeMyFind ($builder, $id) { 
    return parent::find ($id, $this->select_cols); 
} 

Dann aus Ihre Steuerung oder Logic-Datei rufen Sie einfach an:

$rec = MyModel::myFind(1); 
dd ($rec->id, $rec->blah, $rec->my_raw_col); 

Glückliche Tage.

(Funktioniert in Laravel Framework 5.5)

Verwandte Themen