2013-07-18 6 views
4

Допустим, я хочу, чтобы показать полный список наград с типом = «цветом»:параметризованные запросов связывание в ON пункта для LEFT JOIN в Laravel красноречивого/Query Builder

Awards  Type  2013 Winner 
======  ====  =========== 
Blue Award color  Tom 
Red Award  color 
Green Award color  Dan 

Для достижения этого результата я мог есть запрос в Laravel вроде этого:

$year = '2013'; 

$awards = DB::table('awards') 
      ->leftJoin('winners', function($join) use ($year) 
        { 
         $join->on('awards.id','=','winners.award_id'); 
         $join->on('winners.year','=',DB::raw("'".$year."'")); 
        } 
      ->where('awards.type','color') 
      ->get(); 

Если выводить SQL, который генерирует Laravel вы увидите, что только ИНЕК спараметрирован и $ года в ON п является ЛЕФ t уязвим для SQL-инъекций, если я получаю его из ненадежного источника. Кроме того, потенциал кэширования запросов уменьшается, потому что $ year будет часто меняться. Примечание: В случае, если вы думаете, что я просто добавляю второе условие левого соединения к WHERE запроса, these are not the same.

Любые идеи о том, как получить $ year часть запроса, параметризованную?

+0

Я теперь открыт вопрос относительно этого: https://github.com/laravel/framework/issues/1904 – prograhammer

ответ

5

Вот нечетным обходные (не хотел расширять классы Builder и JoinClause):
Примечание: Это нарушит запрос формирования цепочки с -> так замечаете where было отделено ниже.

$query = DB::table('awards') 
     ->leftJoin('winners', function($join) 
       { 
        $join->on('awards.id','=','winners.award_id'); 
        $join->on('winners.year','=',DB::raw('?')); 
       } 
     ->setBindings(array_merge($query->getBindings(),array($year))); 

$query->where('awards.type','color'); 

$awards = $query->get(); 

UPDATE: Taylor addedjoinWhere, leftJoinWhere ... он говорит, что «если у вас есть функция присоединиться просто использовать ->where и ->orWhere изнутри закрытия.» Я все же должен попробовать это.

0

Это происходит прямо из документации Laravel:

Laravel запроса строитель использует параметр PDO связывание во всем для защиты приложения от атак с внедрением SQL. Существует нет необходимости чистить строки передаются как привязки.

Вам не нужно санировать его вообще. Это должно быть хорошо. Если вас это беспокоит, вы можете использовать класс Validator, чтобы проверить его, как хотите.

+0

Если посмотреть на ту часть, где $ год, вы можете видеть, что я помещаю там цитаты. Там что-то принято. Я тестировал, и я обнаружил, что я могу легко вставлять sql в эту часть. Если вы выведете SQL, вы увидите, что везде используется привязка параметров a? покажет, но нет? в предложении ON за год. – prograhammer

+0

Почему бы не попробовать '$ join-> on ('winners.year', '=', $ year)' – searsaw

+0

Это добавит обратные тики (серьезные акценты) в течение года, как этот '' 2013 \ ', и выкинет mysql ошибка. См. Также: http://stackoverflow.com/a/16849231/1110941 – prograhammer

0

В настоящее время вы можете использовать $join->where:

$year = '2013'; 

$awards = DB::table('awards') 
     ->leftJoin('winners', 
       function($join) use ($year) 
       { 
        $join 
         ->on('awards.id','=','winners.award_id') 
         // "where" instead of "on": 
         ->where('winners.year', '=', $year); 
       } 
     ->where('awards.type','color') 
     ->get();