2014-04-08 7 views

Odpowiedz

7

korzystanie DB::statement('your raw query here'). Mam nadzieję że to pomoże.

+7

Spowoduje to zwrócenie wartości boolowskiej, jeśli instrukcja jest select, w klauzulach select użyj DB :: select, aby uzyskać tablicę wyników surowych. – Lucia

+5

Powinieneś używać instrukcji DB :: tylko wtedy, gdy nie oczekujesz żadnych wyników zapytania. – Fusion

26

Możesz spróbować tego:

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

przykład:

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

Ponadto, można użyć coś takiego (Korzystanie Query Builder):

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

Ponadto, może wypróbować coś takiego (przy użyciu Kreatora zapytań):

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

Więcej informacji na temat Raw-Expressions na Laravel website.

+0

To nie wydaje się działać dla pełnego zapytania. I używam Eloquent, a nie DB. Czy to ma znaczenie? – Chilion

+0

W 'Eloquent' nie można użyć pełnego zapytania surowego, ale można użyć wszystkich metod' z 'Konstruktora zapytań' z' Eloquent'. –

+1

'użyj DB;' jeśli DB nie zostanie znaleziony –

6

Nie sądzę, że możesz domyślnie. Rozszerzyłem Eloquent i dodałem następującą metodę.

/** 
* 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); 
} 

Następnie można zrobić coś takiego:

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

Cześć, zadziałało to, gdy został naprawiony jako $ result = DB :: select ('super wymyślne zapytanie tutaj, upewnij się, że masz poprawne kolumny'); W Laravel 5.5 – Yilmazerhakan

0

Można skrócić obsługę wynik pisząc

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

Stare pytanie, już odpowiedział, wiem.

Jednak nikt nie wspomniał o klasie Expression.

To może nie rozwiązać twojego problemu, ponieważ twoje pytanie pozostawia niejednoznaczne pytanie, gdzie w SQL musi być zawarty warunek Raw (czy jest to w instrukcji SELECT czy w instrukcji WHERE?). Jednak ta informacja może okazać się przydatna, niezależnie od tego.

obejmują następujące klasy w pliku modelu:

use Illuminate\Database\Query\Expression; 

Następnie wewnątrz klasy modelu zdefiniować nową zmienną

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' 
] 

i dodać zakres:

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

Następnie z Twój kontroler lub plik logiczny, po prostu zadzwoń:

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

Szczęśliwe dni.

(Działa w Laravel ramach 5.5)