Zend framework2 ZF2和嵌套集-如何使用选择对象进行交叉连接?
要获取嵌套集合中的树,我们必须进行笛卡尔乘积(every with every) 或 使用zf1很容易,但在zf2中,使用\Zend\Db\Sql\Select对象时没有交叉连接 有没有办法使用Select()实现它?或者,纯sql查询是唯一的方法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 {
很遗憾,谷歌搜索失败了,所以提前感谢您的建议。可以将连接类型作为最后一个参数传递
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])
相当于zf2join($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);