2014-04-08 20 views
10

Laravel uygulamasında bir sorgu yapmaya çalışıyorum ve sorgum için normal bir yapı kullanmak istiyorum. Bu sınıf ya Eloquent kullanıyor, bu yüzden tamamen ham bir sorgu yapmak için bir şey bulmam gerekiyor.Hamquent'i nasıl arayabilirim?

Model::query($query); gibi bir şey olabilir. Sadece bu işe yaramıyor.

cevap

7

kullanımını DB::statement('your raw query here'). Bu yardımcı olur umarım.

+7

İfadenin bir seçim olması durumunda bir boolean döndürülür, select cümleleri için bir dizi ham sonuç almak için DB :: select kullanılır. – Lucia

+5

DB :: deyimini, yalnızca herhangi bir sorgu çıktısı beklemediğinizde kullanmalısınız. – Fusion

26

Bunu denemek olabilir:

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

Bir Örnek:

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

Ayrıca, böyle bir şey (Sorgu Oluşturucu kullanma) kullanabilir:

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

Ayrıca, Bu gibi bir şey deneyebilir (Sorgu Oluşturucuyu Kullanma):

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

Laravel website'da Raw-Expressions hakkında daha fazla bilgi edinin.

+0

Bu doesnt tam sorgu için çalışmıyor gibi görünüyor. Ve, Eloquent şeyi kullanıyorum, DB'yi değil. Önemi var? – Chilion

+0

'Eloquent'de tam ham sorguyu kullanamazsınız, ancak' Query Builder'ın tüm yöntemlerini 'Eloquent' ile kullanabilirsiniz. –

+1

'DB'yi kullanın;' DB bulunamadı –

6

Varsayılan olarak yapabileceğinizi düşünmüyorum. Eloquent'i genişlettim ve şu yöntemi ekledim.

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

Daha sonra böyle bir şey yapabilirsiniz:

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

Merhaba, $ result = DB :: select olarak ayarlandığında bana çalıştı ('süper süslü sorgu burada, doğru sütunlara sahip olduğunuzdan emin olun'); Laravel 5.5'de – Yilmazerhakan

0

Zaten cevap

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

Eski soruyu yazarak sonuç işleme kısaltabilir, biliyorum. Bununla birlikte, hiç kimse İfade sınıfından bahsetmiyor gibi görünüyor.

Verilen soru, sorunuzu çözemeyebilir çünkü sorunuzu, SQL'in Raw koşulunun nereye dahil edilmesi gerektiği konusunda belirsiz bırakıyor (SELECT ifadesinde veya WHERE ifadesinde mi?). Ancak, bu bilgi parçasını yararlı bulabilirsin.

Model dosyasında aşağıdaki sınıf ekleyin:

use Illuminate\Database\Query\Expression; 

Sonra Modeli sınıfının içinde yeni değişken

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

tanımlamak Ve bir kapsam ekleyin: dan Sonra

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

senin kontrolörün veya mantıksal dosya, sadece ara:

Günün kutlu olsun.

(İşleri laravel çerçevesinde 5.5'te)

İlgili konular