Zend framework2 ZF2和嵌套集-如何使用选择对象进行交叉连接?

Zend framework2 ZF2和嵌套集-如何使用选择对象进行交叉连接?,zend-framework2,nested-sets,cross-join,Zend Framework2,Nested Sets,Cross Join,要获取嵌套集合中的树,我们必须进行笛卡尔乘积(every with every) 或 使用zf1很容易,但在zf2中,使用\Zend\Db\Sql\Select对象时没有交叉连接 有没有办法使用Select()实现它?或者,纯sql查询是唯一的方法 很遗憾,谷歌搜索失败了,所以提前感谢您的建议。可以将连接类型作为最后一个参数传递 class Select extends AbstractSql implements SqlInterface, PreparableSqlInterface {

要获取嵌套集合中的树,我们必须进行笛卡尔乘积(every with every)

使用zf1很容易,但在zf2中,使用\Zend\Db\Sql\Select对象时没有交叉连接

有没有办法使用Select()实现它?或者,纯sql查询是唯一的方法


很遗憾,谷歌搜索失败了,所以提前感谢您的建议。

可以将连接类型作为最后一个参数传递

class Select extends AbstractSql implements SqlInterface, PreparableSqlInterface
{
    const JOIN_INNER = 'inner';
    const JOIN_OUTER = 'outer';
    const JOIN_LEFT = 'left';
    const JOIN_RIGHT = 'right';
    const SQL_STAR = '*';
    const ORDER_ASCENDING = 'ASC';
    const ORDER_DESENDING = 'DESC';

    public $where; // @param Where $where

    public function __construct($table = null);
    public function from($table);
    public function columns(array $columns, $prefixColumnsWithTable = true);
    public function join($name, $on, $columns = self::SQL_STAR, $type = self::JOIN_INNER);
    public function where($predicate, $combination = Predicate\PredicateSet::OP_AND);
    public function group($group);
    public function having($predicate, $combination = Predicate\PredicateSet::OP_AND);
    public function order($order);
    public function limit($limit);
    public function offset($offset);
}

因此,zf1方法
joinCross(table,[columns])
相当于zf2
join($name,$on,$columns,'cross')

可以将交叉连接操作替换为(内部)连接,其中join子句的计算结果始终为true(1=1)

Zf2示例:

$select = new Sql\Select;

$select ->from(array('node' => 'nested_category'))
        ->columns(array('node_name' => new Sql\Expression('CONCAT(REPEAT(" ", COUNT(parent.name)-1), node.name)')))
        ->join(array('parent' => 'nested_category'), new Sql\Expression('1=1'), array('id'))
        ->where('node.lft BETWEEN parent.lft AND parent.rgt')
        ->group('node.name')
        ->order('node.lft');

$resultSet = $this->selectWith($select);

是的,但是在执行交叉联接时,在子句上没有
,并且Select的联接方法不允许没有它的联接表达式。。。这就是我要问的问题。。。但是,可以通过在id上使用类似
的子句上使用“false”来避免此问题!=0
(也可以是
左连接
class Select extends AbstractSql implements SqlInterface, PreparableSqlInterface
{
    const JOIN_INNER = 'inner';
    const JOIN_OUTER = 'outer';
    const JOIN_LEFT = 'left';
    const JOIN_RIGHT = 'right';
    const SQL_STAR = '*';
    const ORDER_ASCENDING = 'ASC';
    const ORDER_DESENDING = 'DESC';

    public $where; // @param Where $where

    public function __construct($table = null);
    public function from($table);
    public function columns(array $columns, $prefixColumnsWithTable = true);
    public function join($name, $on, $columns = self::SQL_STAR, $type = self::JOIN_INNER);
    public function where($predicate, $combination = Predicate\PredicateSet::OP_AND);
    public function group($group);
    public function having($predicate, $combination = Predicate\PredicateSet::OP_AND);
    public function order($order);
    public function limit($limit);
    public function offset($offset);
}
select * from tree as t1 inner join tree as t2 on 1=1
$select = new Sql\Select;

$select ->from(array('node' => 'nested_category'))
        ->columns(array('node_name' => new Sql\Expression('CONCAT(REPEAT(" ", COUNT(parent.name)-1), node.name)')))
        ->join(array('parent' => 'nested_category'), new Sql\Expression('1=1'), array('id'))
        ->where('node.lft BETWEEN parent.lft AND parent.rgt')
        ->group('node.name')
        ->order('node.lft');

$resultSet = $this->selectWith($select);