我可以在 Zend 2 的 JOIN 语句中使用 WHERE 子句吗?

Can I use WHERE clause within JOIN statement in Zend 2?

我有一个正常的SQL语句,其中returns来自数据库的15条记录。如果我尝试使用 Zend 2 复制相同的东西,它会 returns 9 条记录。不同之处在于其中一个 JOIN 中的一个 WHERE / Conditional 语句。 让我解释一下...

这是一个实际的 SQL 查询:

SELECT FROM 
   BLABLA AS B (some other joins and then..)

       LEFT JOIN
   CITY AS C ON C.SERVICE_ID = B.SERVICE_ID
                AND C.DELETED = FALSE
   WHERE
       (B.PRODUCT_ID = 2219)
          AND (B.DELETED = FALSE);

如您所见,JOIN 语句中有一个 WHERE / Conditional (AND C.DELETED = FALSE) 子句,我想在 Zend 2 DB select 中做同样的事情。

所以我这样做:

$select = $sql->select(); // This is Zend 2's select()

$select->from(
            ['B' => 'BLABLA']
        )

        ->columns(
            [
                'VALUE',
                'NOTES',
                'SERVICE_ID'
            ]
        )


        ->join(
            ['C' => 'CITY'],
            'C.SERVICE_ID = B.SERVICE_ID',
            'left'
        )

        ->where('C.DELETED = FALSE') // If I remove this line, it returns 15 records just like that plain SQL query, however doing so I lose this conditional statement. If I don't remove it, it returns 9 records.
        ->where('B.DELETED = FALSE')
        ->where('B.PRODUCT_ID = 2219');

我做错了什么? :(

请尝试下面的 ZEND SQL 代码。

$select = $sql->select(); // This is Zend 2's select()

$select->from(
            ['B' => 'BLABLA']
        )

        ->columns(
            [
                'VALUE',
                'NOTES',
                'SERVICE_ID'
            ]
        )


        ->join(
            ['C' => 'CITY'],
            'C.SERVICE_ID = B.SERVICE_ID AND C.DELETED = FALSE',
            'left'
        )
        ->where('B.DELETED = FALSE')
        ->where('B.PRODUCT_ID = 2219');

解决了。

显然你需要用一个表达式来包装这些东西。所以就我而言:

->join(
     ['C' => 'CITY'],
     new \Zend\Db\Sql\Expression('C.SERVICE_ID = B.SERVICE_ID AND C.DELETED = FALSE'),
     'left'
)