/** * 查询所有符合条件的记录及相关数据,返回一个包含多行记录的二维数组,失败时返回 false * * @param mixed $conditions * @param string $sort * @param mixed $limit * @param mixed $fields * @param mixed $queryLinks * * @return array */ function &findAll($conditions = null, $sort = null, $limit = null, $fields = '*', $queryLinks = true) { list($whereby, $distinct) = $this->getWhere($conditions); // 处理排序 $sortby = $sort != '' ? " ORDER BY {$sort}" : ''; // 处理 $limit if (is_array($limit)) { list($length, $offset) = $limit; } else { $length = $limit; $offset = null; } // 构造从主表查询数据的 SQL 语句 $enableLinks = count($this->links) > 0 && $this->autoLink && $queryLinks; $fields = $this->dbo->qfields($fields, $this->fullTableName, $this->schema); if ($enableLinks) { // 当有关联需要处理时,必须获得主表的主键字段值 $sql = "SELECT {$distinct} {$this->qpka}, {$fields} FROM {$this->qtableName} {$whereby} {$sortby}"; } else { $sql = "SELECT {$distinct} {$fields} FROM {$this->qtableName} {$whereby} {$sortby}"; } // 根据 $length 和 $offset 参数决定是否使用限定结果集的查询 if (null !== $length || null !== $offset) { $result = $this->dbo->selectLimit($sql, $length, $offset); } else { $result = $this->dbo->execute($sql); } if ($enableLinks) { /** * 查询时同时将主键值单独提取出来, * 并且准备一个以主键值为键名的二维数组用于关联数据的装配 */ $pkvs = array(); $assocRowset = null; $rowset = $this->dbo->getAllWithFieldRefs($result, $this->pka, $pkvs, $assocRowset); $in = 'IN (' . implode(',', array_map(array(&$this->dbo, 'qstr'), $pkvs)) . ')'; } else { $rowset = $this->dbo->getAll($result); } unset($result); // 如果没有关联需要处理或者没有查询结果,则直接返回查询结果 if (!$enableLinks || empty($rowset) || !$this->autoLink) { return $rowset; } /** * 遍历每一个关联对象,并从关联对象获取查询语句 * * 查询获得数据后,将关联表的数据和主表数据装配在一起 */ $callback = create_function('& $r, $o, $m', '$r[$m] = null;'); foreach ($this->links as $link) { /* @var $link FLEA_Db_TableLink */ $mn = $link->mappingName; if (!$link->enabled || !$link->linkRead) { continue; } if (!$link->countOnly) { array_walk($assocRowset, $callback, $mn); $sql = $link->getFindSQL($in); $this->dbo->assemble($sql, $assocRowset, $mn, $link->oneToOne, $this->pka, $link->limit); } else { $link->calcCount($assocRowset, $mn, $in); } } return $rowset; }