Zend framework2 Zf2不在Where子句中的表达式中

Zend framework2 Zf2不在Where子句中的表达式中,zend-framework2,where-clause,Zend Framework2,Where Clause,我试图从另一个表中尚未出现的表中获取结果。 为此,我在where子句中使用了一个子查询和一个NOT IN表达式。正常工作的sql如下所示: 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 pr

我试图从另一个表中尚未出现的表中获取结果。 为此,我在where子句中使用了一个子查询和一个NOT IN表达式。正常工作的sql如下所示:

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)
我在项目中使用zf2。问题是我不知道如何在where子句内的表达式中使用NOT。我们可以将where->in()用于where子句中的in表达式。例如

//$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);
但我不知道如何在表达中使用NOT

像使用In()一样使用notIn()。
见:

$subSelect=$this->getRawSql()->select('product_collection');
$subSelect->columns(数组('pro_id'));
$subSelect->where(数组('coll_id'=>$collectionId));
$select=$this->getRawSql()->select('products');
$select->where->notIn('products.pro_id',$subSelect)
->其中->in('products.pro_id',$productid);
编辑:

或者用这个代替

$select->where
->addPredicate(新的Zend\Db\Sql\Predicate\Expression('products.pro_id NOT IN(?),
数组($subSelect)))

我明白了,我们不能对NotIn谓词使用->运算符。我必须创建一个NotIn谓词的新实例,并将其传递给下面这样的where子句以使其工作

$select -> where(new NotIn('products.pro_id',$subSelect))
谢谢福阿德的帮助。 或者像福阿德暗示的那样,我在下面试过了,它也成功了

$select -> where->addPredicate(new \Zend\Db\Sql\Predicate\Expression('products.pro_id NOT IN (?)', array($subSelect)))

我之前已经猜到了这一点,但是当我使用notIn表达式时,我犯了一个致命的错误<代码>致命错误:调用未定义的方法Zend\Db\Sql\Where::notIn()并且我正在使用zf 2.1.4。友好提示:此语法仅适用于选择查询。我当时正在绞尽脑汁想弄清楚为什么它不能处理删除查询,结果发现Zend\Db\Sql\DELETE::where()不接受PredicateInterface实例作为第一个参数。它只是忽略了它。所以你不能做
$delete->where(newnotin('products.pro_id',$subSelect))。相反,您必须结合您的解决方案:
$delete->where->addPredicate(newnotin('products.pro_id',$subSelect))