2017-12-13 10 views
0

は、私はこのような検索クエリ持っているの列の配列を渡す:今Laravelは - 「」句

$data = User::where('first_name', 'like', '%'.$query.'%') 
    ->orWhere('last_name', 'like', '%'.$query.'%') 
    ->get(); 

を、私は、別の列名を持つ各を多くのモデルを持っています。

// User 
public static function searchableFields() 
{ 
    return ['first_name', 'last_name']; 
} 

// Some other model 
public static function searchableFields() 
{ 
    return ['name', 'description']; 
} 

そして、共有コントローラにこのような何かの検索ロジックを置く:どのように私はこれを達成することができます

$data = $classname:: 
    where($classname::searchableFields(), 'like', '%'.$query.'%') 
    ->get(); 

をする代わりに、すべてのコントローラにsearch()関数を定義するのは、私はこれを行うにはしたいですか?

ありがとうございます。

+0

通常、列名は動的SQLを使用するのではなく、問合せのパラメータにすることはできません。何列目に列挙すれば問題になるのですか? –

答えて

1

あなたがフィールドをループをすることができますし、自分の雄弁クエリ一つずつに追加します。

$data = $classname::where(function ($query) use ($classname) { 
    foreach ($classname::searchableFields() as $field) 
     $query->orWhere($field, 'like', '%' . $query . '%'); 
})->get(); 
+0

ありがとうJerodev!それはまさに私が探していたものです。それは魅力のように機能します! – Oscar

+0

うれしい私は助けることができます。これをあなたの質問の解決策としてマークして、他のユーザーもこれを見つけるかもしれません。 – Jerodev

+0

@Oscarそれに答えて –

0

このようなことを試すことができます。

//コントローラ

function getIndex(Request $request) 
{ 
    $this->data['users'] = User::orderBy('first_name','asc')->get(); 

    if ($request->has('keyword')) { 
     $results    = User::search($request->keyword); 
     $this->data['users'] = collect([$results])->collapse()->sortBy('first_name'); 
    } 
} 

//モデル

function search($keyword) 
{ 
    $results  = []; 
    $search_list = ['first_name','last_name']; 
    foreach ($search_list as $value) 
    { 
     $search_data = User::where($value,'LIKE','%'.$keyword.'%')->get(); 
     foreach ($search_data as $search_value) { 
      $exist = 0; 
      if (count($results)) { 
       foreach ($results as $v) { 
        if ($search_value->id == $v->id) { 
         $exist++; 
        } 
       } 
       if ($exist == 0) { 
        $results[] = $search_value; 
       } 
      } else{ 
       $results[] = $search_value; 
      } 
     } 
    } 
    return $results; 
} 
+0

しかし、これはキーワードがあるように多くのクエリを実行し、不必要なコードがたくさんあります。 – Jerodev

1

私はそれにスコープを使用します。

あなたは、すべてのモデルが拡張する必要があります(このモデルは雄弁モデルを拡張する必要があります)ベースモデルを作成することができますし、このモデルでは、あなたは、このようなメソッドを追加する必要があります

public function scopeMatchingSearch($query, $string) 
{ 
    $query->where(function($q) use ($string) { 
     foreach (static::searchableFields() as $field) { 
      $q->orWhere($field, 'LIKE', '%'.$string.'%'); 
     } 
    }); 
} 

今、あなたは、このような検索を行うことができます。

$data = User::matchingSearch($query)->get(); 

ただ、混乱を避けるために - matchingSearchに渡さ$queryパラメータは、この方法では$stringパラメータとなります。

+0

こんにちはMarcin、これは素晴らしいアプローチであり、うまく動作します。 – Oscar