2015-05-04 1 views
0

Если у меня есть следующий запрос построен с использованием Query Builder:Laravel Query Builder: whereExists переводит статью условие на знак вопроса

$q = DB::table('Products')->whereExist(function ($q) 
{ 
    $q->select(DB::raw(1)) 
     ->from('tags_products') 
     ->where('products.PorductId', '=', 'tags_products.ProductID'); 
}); 

Переведенный SQL с помощью $q->toSql(); что:

select * from `Products` where `exist` = (select 1 from `tags_products` where `products`.`ProductID` = ?) 

По-видимому, Query Builder переводит tags_products.ProductID в ?.

Почему это становится "?"?

ответ

2

Как @ Jared Eitnier очень хорошо указал, Laravel использует PDO для привязки параметров, которые вы передаете методам Query Builder. Однако, поскольку, когда вы используете where, третий параметр представляет значение, Laravel не будет рассматривать его как столбец, если вы явно не укажете его, иначе он будет обрабатывать 'tags_products.ProductID' как обычное строковое значение. Таким образом, у вас есть два варианта здесь:

1. Используйте DB::raw(), чтобы позволить Query Builder знать, что значение не является строкой, которая требует побега:

->where('products.PorductId', '=', DB::raw('tags_products.ProductID')); 

2. Использование whereRaw(), который позволит вы должны написать необработанную инструкцию SQL:

->whereRaw('products.PorductId = tags_products.ProductID'); 

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

  • Нет связанных вопросов^_^