Пример #1
0
 /**
  * 查询所有符合条件的记录及相关数据,返回一个包含多行记录的二维数组,失败时返回 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;
 }