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, так как я могу передать $q на запрос в Laravel? Все, что я пытаюсь сделать, это сделать запрос безопасным для 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 из коробки. Вам нужно будет создать объект paginator самостоятельно, как показано здесь: 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) *. Я отметил другой ответ как принятый, потому что тот объяснил, как использовать 'union' в Laraval * (что именно я искал) *. во всяком случае, этот ответ является точным ответом на мой вопрос * (независимо от моих потребностей) *. – stack

Смежные вопросы