【问题标题】:ZF2 and nested sets - how to do cross join using Select object?ZF2 和嵌套集 - 如何使用 Select 对象进行交叉连接?
【发布时间】:2013-09-14 17:25:59
【问题描述】:

要在嵌套集中获取树,我们必须进行笛卡尔积(每个与每个)。

select * from tree as t1, tree as t2

select * from tree as t1 cross join tree as t2

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

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

不幸的是,谷歌搜索失败了,所以提前感谢您的任何建议。

【问题讨论】:

    标签: zend-framework2 nested-sets cross-join


    【解决方案1】:

    CROSS JOIN 操作可以替换为 (INNER) JOIN,其中 join 子句的计算结果始终为 true (1=1)

    select * from tree as t1 inner join tree as t2 on 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);
    

    【讨论】:

      【解决方案2】:

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

      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')

      【讨论】:

      • 是的,但是在进行 CROSS JOIN 时没有 ON 子句,并且 Select 的连接方法不允许没有它的连接表达式......这就是我要问的问题......但是这个可以通过使用像ON id != 0 这样的“假” ON 子句来避免问题(也可以是LEFT JOIN
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 2021-07-28
      • 2013-08-03
      • 2012-05-22
      相关资源
      最近更新 更多