Sql 引用IS、NULL、NOT、!、时出现问题!,以及Zend Framework 2中关于连接子句条件的其他保留字符串

Sql 引用IS、NULL、NOT、!、时出现问题!,以及Zend Framework 2中关于连接子句条件的其他保留字符串,sql,join,zend-framework2,quoting,zend-db-select,Sql,Join,Zend Framework2,Quoting,Zend Db Select,我有一个SQL语句,它通过关联表courses\u trainers与他们的培训师选择体育课程。由于有些课程有多个培训师,我使用小组讨论。。。函数将培训师名称输入一个字段。一些培训师行为空或NULL,因此我添加了一个培训师。名称不为NULL和一个培训师。名称!=培训师加入条款的条件: SQL语句 CourseTable类中的OO变量 生成的连接代码如下所示: LEFT JOIN `courses_trainers` ON `courses`.`id` = `courses_trainer

我有一个SQL语句,它通过关联表courses\u trainers与他们的培训师选择体育课程。由于有些课程有多个培训师,我使用小组讨论。。。函数将培训师名称输入一个字段。一些培训师行为空或NULL,因此我添加了一个培训师。名称不为NULL和一个培训师。名称!=培训师加入条款的条件:

SQL语句

CourseTable类中的OO变量

生成的连接代码如下所示:

LEFT JOIN
    `courses_trainers` ON `courses`.`id` = `courses_trainers`.`course_id`
LEFT JOIN
    `trainers` ON `trainer_id` = `trainers`.`id`
    AND `trainers`.`name` `IS` `NOT` `NULL`
    AND `trainers`.`name` `!`= `"``"`
所以,这里有很多人引用


如何向ZF解释,即不应引用,等等?

负责引用的是或更精确地说,它的实现,在本例中,作为第二个参数的是一个安全字数组。Zend\Db\Sql\SelectprocessJoins。。。将数组“=”和“,”或“,”之间的“,”添加到它。照原样,不是!等不在列表中,它们被引用

解决方案是扩展Zend\Db\Sql\Select并覆盖它,在quoteIdentifierInFragment中的第二个参数列表中添加所需的额外安全字。。。电话:

join方法接受表达式作为ON子句的第二个参数


你试过把ON子句变成一个表达式吗?ie->join'trainers',新表达式'trainer\u id=trainers.id和trainers.name不为空且trainers.name!=',哦,不!我花了这么多的精力来解决这个问题,而且解决方法非常简单!:它起作用了!而且比我的解决方案更优雅!请根据您的评论创建一个答案,以便我可以接受。哎哟!我不得不承认,我不是100%肯定它会起作用,因为考虑到你所做的工作,这似乎太容易了。
public function findOnceByID($id) { 
    $concatDelimiter = self::CONCAT_DELIMITER;
    $select = new Select();
    ...
    $select->columns(array(
        'id', ...
    ));
    $select->from($this->tableGateway->getTable());
    $select
        ...
        ->join('courses_trainers', 'courses.id = courses_trainers.course_id', array(), Select::JOIN_LEFT)
        ->join('trainers', 'trainer_id = trainers.id AND trainers.name IS NOT NULL AND trainers.name != ""', array(
            'trainers' => new Expression('GROUP_CONCAT(DISTINCT trainers.name SEPARATOR "' . $concatDelimiter . '")')
            ), Select::JOIN_LEFT)
        ...
    ;
    $where
        ->equalTo('courses.id', $id)
    ;
    $select->where($where, Predicate::OP_AND);
    $select->group('courses.id');
    $resultSet = $this->tableGateway->selectWith($select);
    return $resultSet;
}
LEFT JOIN
    `courses_trainers` ON `courses`.`id` = `courses_trainers`.`course_id`
LEFT JOIN
    `trainers` ON `trainer_id` = `trainers`.`id`
    AND `trainers`.`name` `IS` `NOT` `NULL`
    AND `trainers`.`name` `!`= `"``"`
<?php
namespace MyNamespace\Db\Sql;

use Zend\Db\Adapter\Driver\DriverInterface;
use Zend\Db\Adapter\StatementContainerInterface;
use Zend\Db\Adapter\ParameterContainer;
use Zend\Db\Adapter\Platform\PlatformInterface;
use Zend\Db\Sql\Select as ZendSelect;

class Select extends ZendSelect
{

    ...

    protected function processJoins(PlatformInterface $platform, DriverInterface $driver = null, ParameterContainer $parameterContainer = null)
    {
        ...
        // process joins
        $joinSpecArgArray = array();
        foreach ($this->joins as $j => $join) {
            ...
            $joinSpecArgArray[$j][] = ($join['on'] instanceof ExpressionInterface)
                ? $this->processExpression($join['on'], $platform, $driver, $this->processInfo['paramPrefix'] . 'join' . ($j+1) . 'part')
                : $platform->quoteIdentifierInFragment($join['on'], array('=', 'AND', 'OR', '(', ')', 'BETWEEN', '<', '>', '!', 'IS', 'NULL', 'NOT', '"')); // on
            ...
        }

        return array($joinSpecArgArray);
    }

    ...

}
->join('trainers', new Expression('trainer_id = trainers.id AND trainers.name IS NOT NULL AND trainers.name != ""'),