2016-10-26 2 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# ([여기를 클릭] union)을 사용하여 문제 조합을 찾습니다. –

+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

죄송합니다 misread :) thanks! –

+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

관련 문제