Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Zend framework2 如何在加入zend framework 2中使用multiple-on子句_Zend Framework2 - Fatal编程技术网

Zend framework2 如何在加入zend framework 2中使用multiple-on子句

Zend framework2 如何在加入zend framework 2中使用multiple-on子句,zend-framework2,Zend Framework2,我正在这样做,将sql转换为zend框架sql模式 SELECT jobs . *, c.id AS cid, c.name AS name, c.companyImage AS companyImage, c.logo AS logo, count(app.userId) AS t_app, app.applyStatus AS applyStatus, app.userId AS appUserId FROM jobs

我正在这样做,将sql转换为zend框架sql模式

SELECT 
    jobs . *,
    c.id AS cid,
    c.name AS name,
    c.companyImage AS companyImage,
    c.logo AS logo,
    count(app.userId) AS t_app,
    app.applyStatus AS applyStatus,
    app.userId AS appUserId
FROM
    jobs
        LEFT JOIN
    companies AS c ON jobs.companyName = c.id
        LEFT JOIN
    applicants AS app ON jobs.id = app.jobId AND app.applyStatus = 1
WHERE
    jobs.ownerId = 16 AND jobs.draftId != 0 
GROUP BY jobs.id
ORDER BY jobs.id DESC
LIMIT 3 
对于这个sql,我已经为zend framework 2编写了这段代码

$adapter = $this->tableGateway->getAdapter();
        $sql     = new Sql($adapter);

        $select = $sql->select();
        $select->from('jobs')
                ->join(array('c' => 'companies'), 'jobs.companyName = c.id', array('cid' => 'id', 'name', 'companyImage', 'logo'), 'left')
                ->join(array('app' => 'applicants'), ' jobs.id = app.jobId AND app.applyStatus = 1', array('t_app'     => new Expression('count(app.userId)'), 'applyStatus', 'appUserId' => 'userId'), 'left')
                ->where("jobs.ownerId ={$userId} AND jobs.draftId != 0")
                ->group('jobs.id')
                ->order('jobs.id DESC')
                ->limit(3);

        $statement = $sql->getSqlStringForSqlObject($select);
        $results   = $adapter->query($statement, $adapter::QUERY_MODE_EXECUTE);
但不能正常工作,它会发出如下信息

SQLSTATE[42S22]: Column not found: 1054 Unknown column '1' in 'on clause'

问题在于这一部分:

app.applyStatus = 1
框架正在转义1,就好像它是一个列名,
1

您还需要将此部分包含在表达式中

new Expression('jobs.id = app.jobId AND app.applyStatus = 1')

我认为join方法的“ON”参数中表达式的使用可能取决于您使用的ZF2版本,我认为它是在2.1+中添加的,这将产生安全问题。Zf2将您的查询更改为:

Select * from tableA inner join tableB 
on `tableA`.`column` = `tableB`.`column` 
AND `tableB`.`column` = `1`
它补充道

`


每个部分都有安全问题!通过使用
new Expression
您将绕过它,如果您从用户条目中获得
applyStatus
,请确保对其进行过滤

基于这个答案。如果还希望转义表和列标识符,请使用以下语法:

use Zend\Db\Sql\Expression;

...

$onExpression = new Expression('? = ? AND ? = ?', 
    ['jobs.id', 'app.jobId', 'app.applyStatus', 1], 
    [Expression::TYPE_IDENTIFIER, Expression::TYPE_IDENTIFIER, 
     Expression::TYPE_IDENTIFIER, Expression::TYPE_LITERAL]
);

$select->from('jobs')
    ->join(array('app' => 'applicants'), $onExpression, array('t_app' => new Expression('count(app.userId)'), 'applyStatus', 'appUserId' => 'userId'), 'left');
表达式构造函数接受字符串,然后是参数,然后是参数类型

public function __construct($expression = '', $parameters = null, array $types = [])