2016-10-26 11 views
0

私はLaravelを使用しています。ご存じのように、LaravelはクエリのUNION句をサポートしていません。だから私はrawと書いて、結果全体をページングする必要があります。このような何か:どのようにクエリにパラメータを渡すことができますか?

$results = DB::select('SELECT id, title, description, imgPath 
         FROM news n 
         WHERE n.title LIKE %$q OR n.description LIKE %$q 
         UNION ALL 
         SELECT id, title, description, imgPath 
         FROM productions p 
         WHERE p.title LIKE %$q OR p.description LIKE %$q 
         '); 

私が言ったように、私はLaravelを使用して、そこでどのように私はLaravelでクエリに$qを渡すことができますか?私がしようとしているのは、クエリをSQLインジェクションに対して安全にすることだけです。だからこそ、私はクエリにパラメータを直接渡すのではなく、クエリに渡そうとしているのです。純粋なPHPで


私はこのようなことを行うことができます。

$st = $dbh->prepare('SELECT ... WHRER col LIKE %:q'); 
$st->bindParam(':q', $q, PDO::PARAM_INT); 

私はこの^ Laravelのように何かをしたいです。

+0

https://laravel.com/docs/5.3/queries#([こちらをクリック]ユニオン)を使用して問題のユニオンを使用しているか調べます。 –

+0

これを確認するhttp://stackoverflow.com/questions/20864872/how-to-bind-parameters-to-a-raw-db-query-in-laravel-thats-used-on-a-modelパラメータバインディングについての回答。 – aleksejjj

答えて

3

はい、労働組合があります:https://laravel.com/docs/5.3/queries#unions

私はそれをテストしていないが、それはすべき次のようになります。

$first = DB::table('news') 
    ->select(['id', 'title', 'description', 'imgPath']) 
    ->where(function($query) use ($q) { 
     $query->where('title', 'like', "%$q") 
       ->orWhere('description', 'like', "%$q"); 
    }); 

$result = DB::table('productions') 
    ->select(['id', 'title', 'description', 'imgPath']) 
    ->where(function($query) use ($q) { 
     $query->where('title', 'like', "%$q") 
       ->orWhere('description', 'like', "%$q"); 
    }) 
    ->unionAll($first) 
    ->get(); 

注:あなたが勝った組合と

ボックスの外にpaginateを行うことはできません。 Laravel - Union + Paginate at the same time?

+0

パーフェクト...私が言ったように、私は 'paginate()'を使う必要があるので、 'get()'を 'paginate()'に置き換えてください。 upvote – stack

+1

oops misread :)ありがとう! –

+0

いくつかのテストの後で、私は ' - > get()'の動​​作を理解しましたが、 ' - > paginate()'は動作しません。このエラーをスローします: 'SQLSTATE [21000]:カーディナリティ違反:1222使用されたSELECT文の列数が異なります。なにか提案を? – stack

2

あなたの「純粋なPHPコード」は動作しません。 SQLとPDOの構文を尊重する必要があります

$st = $dbh->prepare('SELECT ... WHRER col LIKE :q'); 
$st->bindParam(':q', "%$q"); 

となります。

Laravelと同じ:クエリでプレースホルダを定義し、それをパラメータとして送信する必要が

$sql = 'SELECT * FROM news WHERE title LIKE :q OR description LIKE :q'; 
$results = DB::select($sql, ['q' => "%$q"]); 
+0

ブラボーバディー... ;-) upvote – stack

+0

みんな、この答えは私の質問の答えです*(laravelでパラメータを渡す方法)*。私はLaraval *(正確には私が探していたもの)*で 'union'を使う方法を説明したので、受け入れられた別の答えをマークしました。とにかく、この答えは私の質問*(私のニーズに関係なく)*の正確な答えです。 – stack

関連する問題