Example #1
0
 /**
  * find:
  * Locates records in this table meeting the criteria supplied in the
  * first argument (an associative array of column names and their expected values).
  */
 static function find($criteria = array(), $sort = false, $limitStart = false, $limitEnd = false, $cacheSingleRowOnLoad = false)
 {
     $q = "SELECT * FROM `" . static::$_tableName . "`";
     $whereBits = array();
     foreach ($criteria as $column => $value) {
         $operand = '=';
         if (preg_match('/^(.+):(.+)$/', $column, $bits)) {
             $column = addslashes($bits[1]);
             $operandWord = $bits[2];
             switch ($operandWord) {
                 case 'ne':
                     $operand = '!=';
                     break;
                 case 'gt':
                     $operand = '>';
                     break;
                 case 'gte':
                     $operand = '>=';
                     break;
                 case 'lt':
                     $operand = '<';
                     break;
                 case 'lte':
                     $operand = '<=';
                     break;
                 case 'like':
                     $operand = 'LIKE';
                     break;
             }
         }
         $value = addslashes($value);
         $whereBits[] = "`{$column}` {$operand} '{$value}'";
     }
     if (!empty($whereBits)) {
         $q .= " WHERE " . implode(' AND ', $whereBits);
     }
     if ($sort && !is_array($sort)) {
         $sort = array($sort);
     }
     if ($sort) {
         $sortBits = array();
         foreach ($sort as $field) {
             if (preg_match('/^(.*):(.*)$/', $field, $bits)) {
                 $order = strtoupper($bits[2]);
                 if ($order != 'DESC' && $order != 'ASC') {
                     $order = '';
                 }
                 $field = "`{$bits[1]}` {$order}";
             } else {
                 $field = "`{$field}`";
             }
             $sortBits[] = $field;
         }
         $q .= ' ORDER BY ' . implode(', ', $sortBits);
     }
     if ($limitStart !== false && is_numeric($limitStart)) {
         $q .= " LIMIT {$limitStart}";
         if ($limitEnd !== false && is_numeric($limitEnd) && $limitEnd > 0) {
             $q .= ", {$limitEnd}";
         }
     }
     $set = Database::query($q);
     if (!$set) {
         return false;
     }
     $className = get_called_class();
     $results = array();
     $lastRow = false;
     while ($row = Database::fetchMap($set)) {
         $results[] = new $className($row);
         $lastRow = $row;
     }
     if (count($results) == 0) {
         $results = false;
     } elseif (count($results) == 1) {
         $results = $results[0];
         if ($cacheSingleRowOnLoad && !empty(static::$_cachePrefix)) {
             Cache::set(static::$_cachePrefix . $results->getId(), $lastRow);
         }
     }
     return $results;
 }