zend framework2 - query - Zf2 NO EN expresión en la cláusula Where
zend framework sql query (2)
Estoy tratando de obtener resultados de una tabla que no está presente en otra tabla. Para esto estoy usando una expresión subQuery y NOT IN en where clause. El sql normal que funciona se ve así:
SELECT `products`.* FROM `products` WHERE `products`.`pro_id` **NOT IN** (
SELECT `product_collection`.`pro_id` AS `pro_id` FROM `product_collection` WHERE `coll_id` = ''6'' ) AND products.pro_id IN (55,56,57,62)
Estoy usando zf2 para el proyecto. El problema es que no sé cómo usar la expresión NOT IN dentro de la cláusula where. Podemos usar where-> in () para la expresión IN en la cláusula Where. por ej.
//$productIds is an array
//$collectionId is an id
$subSelect = $this->getRawSql()->select(''product_collection'');
$subSelect -> columns(array(''pro_id''));
$subSelect -> where(array(''coll_id''=>$collectionId));
$select = $this->getRawSql()->select(''products'');
$select -> **where->in**(''products.pro_id'', $subSelect)
-> where->in(''products.pro_id'',$productIds);
pero no tengo idea de cómo usar la expresión NOT IN.
Lo descubrí, no pudimos usar el operador -> para el predicado NotIn. Tuve que crear una nueva instancia de NotIn Predicate y pasarla a la cláusula where como a continuación para que funcione.
$select -> where(new NotIn(''products.pro_id'',$subSelect))
Gracias Fouad por la ayuda. o como insinuó Fouad, lo intenté a continuación y ¡también funcionó !.
$select -> where->addPredicate(new /Zend/Db/Sql/Predicate/Expression(''products.pro_id NOT IN (?)'', array($subSelect)))
Use notIn () como lo hace con In ().
Ver: http://framework.zend.com/apidoc/2.1/classes/Zend.Db.Sql.Predicate.NotIn.html
$subSelect = $this->getRawSql()->select(''product_collection'');
$subSelect -> columns(array(''pro_id''));
$subSelect -> where(array(''coll_id''=>$collectionId));
$select = $this->getRawSql()->select(''products'');
$select ->where->notIn(''products.pro_id'', $subSelect)
->where->in(''products.pro_id'',$productIds);
Editar:
O usa esto en su lugar
$select ->where
->addPredicate(new Zend/Db/Sql/Predicate/Expression(''products.pro_id NOT IN (?)'',
array($subSelect)))