2016-10-05 9 views
0

私はすべての候補が複数のステータスを持つ候補とステータステーブルを持っています。ステータスが変更されると、新しいステータスを格納するためにステータステーブルの新しいローが作成されます。だから、ユーザーがステータスで候補をフィルタリングしたいとき、私は候補者を選択して、現在の状態はすべての状態ではなくすべての状態を選択します。 私のクエリは次のとおりです。現在のステータスが文字列と等しい文字列

$status = $request->get('status'); 

     $q->where(function ($q) use ($status) { 
      $q->orWhereHas('statuses', function ($q) use ($status) { 
       $q->where('status', 'like', "%" . $status . "%"); 
      }); 
     }); 

答えて

0

私は質問を吹き替えに変更しました。うまくいきました。

$q->whereRaw('status LIKE "%'.$status.'%" AND id=(select max(id) from statuses WHERE status LIKE "%'.$status.'%")'); 

EDIT:

上記でクエリが問題を持っており、それはそれが彼らのすべてのように、私はこれにクエリを変更のみの取得最初のマッチング候補ではないです。

$q->where(function ($q) use ($status) { 
      $q->orWhereHas('statuses', function ($q) use ($status) { 
       $q->whereRaw('status LIKE ? AND id IN (SELECT MAX(id) FROM statuses GROUP BY candidate_id)',["%".$status."%"]); 
      }); 
     }); 
+0

このSQLインジェクションがどのように行われるかです。 –

+0

私は知っているが、ステータスはユーザーから直接取得されていない。 –

-1

私percipienceは、候補者の現在のステータスが最後のレコードです。 私はmysqlの方向を言います。あなたのマイグレーションとモデリングについては、これを実装してください。

select * from status 
where id =(
    select max(id) from status 
    where candidate_id= x 
    ) 

xは候補IDです。

関連する問題