2016-03-25 22 views
1

Bu yüzden bir arama sayfası oluşturmaya çalışıyorum ve birden çok alma seçeneği var. Ancak bunu nasıl doğru şekilde ayarlayacağımı merak ediyorum, bunun çok uzak olduğunu biliyorum bir değişkenin içinde ifadeler varsa, yaptığım gibi doğru, Ama şu anda çok kayboldum.Laravel'de dinamik sorgular oluşturma - çoktan seçmeli arama nasıl yapılır

Herhangi bir yardım büyük memnuniyetle karşılanacaktır.

public function index() 
{ 

    $queryUsername = Request::get('u'); 
    $queryPostcode = Request::get('p'); 
    $queryOrderbyPhotos = Request::get('o1'); 
    $queryOrderbyOnline = Request::get('o2'); 
    $queryOrderbyTypes = Request::get('o3'); 

    $users = User::rightJoin('user_profiles','users.id', '=', 'user_profiles.user_id') 

    if ($queryUsername) 
    { 
     ->where('users.username', '=', "$queryUsername") 
    } 
    if ($queryPostcode) { 
     ->where('user_profiles.postcode', '=', "$queryPostcode") 
    } 
    if ($queryOrderbyPhotos) { 
     ->whereNotNull('user_profile.avatar') 
    } 
    if ($queryOrderbyOnline) { 
     ->orderBy('users.last_online', 'DESC') 
    } 
    if ($queryOrderbyType) {  
     ->orderBy('users.type', 'DESC') 
    } 
    ->get(); 

    return view('view', compact('users')); 
} 

cevap

3

Bu Sorunu yaklaştığında nasıl. Sorgu oluşturucuyu tutan bir değişken oluşturacağım ve bunun üzerine tüm ek sorgu yöntemlerini çağıracağım.

anlamlı ile ve aslında bunu yapabilirsiniz Method Chaining izin veren herhangi bir sınıf ile:

$query = User::select(...)->join(..); 
$query->where(...); 
$query->get(...); 

Yani sizin durumda ben bu şekilde istediğini elde etmek için çalışıyor olacağım:

public function index() 
    { 
     $input = Request::all(); 

     $query = User::rightJoin('user_profiles', 'users.id', '=', 'user_profiles.user_id'); 

     if (isset($input['u']) && $input['u']) 
      $query->where('users.username', '=', $input['u']); 

     if (isset($input['p']) && $input['p']) 
      $query->where('user_profiles.postcode', '=', $input ['p']); 

     if (isset($input['o1']) && $input['o1']) 
      $query->whereNotNull('user_profile.avatar'); 

     if (isset($input['o2']) && $input['o2']) 
      $query->orderBy('users.last_online', 'DESC'); 

     if (isset($input ['o3']) && $input['o3']) 
      $query->orderBy('users.type', 'DESC'); 

     $users = $query->get(); 

     return view('view', compact('users')); 
    } 

Elbette, her giriş parametresinde geçerli giriş için ek bir kontrolünüz olması iyi bir fikir olacaktır. Ancak bu birçok yönden başarılabilir. Sen ben ince denetleyicileri tutarak tercih olarak Modelinizdeki veya ayrı sınıftaki tüm bu kodu taşımak için öneride bulunuruz arada daha

Laravel Controller Validation hakkında veya Laravel Form Request Validation okuyabilir.

+0

Yardımlarınız için çok teşekkür ederim, Evet, gerçekten sql saldırılarını durdurmak için doğrulamayı araştırıyordum. –

+0

Üzgünüm size yanlış bir bağlantı verdim. Laravel 5.1 + kullanıyorsanız, karmaşık doğrulama kurallarını ayrı tutmak için Form isteği doğrulamasını kullanmanızı öneririm: https://laravel.com/docs/5.1/validation#form-request-validation – iivannov

1

Deneyebilirsin:

$users_query = new User; 
$users_query->rightJoin(....); 

if ($queryUsername) 
{ 
    $users_query->where('users.username', '=', "$queryUsername") 
} 
// Your other conditions ..... 
.... 

$users = $users_query->get();