/** * Fetches rows by primary key. The argument specifies one or more primary * key value(s). To find multiple rows by primary key, the argument must * be an array. * * This method accepts a variable number of arguments. If the table has a * multi-column primary key, the number of arguments must be the same as * the number of columns in the primary key. To find multiple rows in a * table with a multi-column primary key, each argument must be an array * with the same number of elements. * * The find() method always returns a Rowset object, even if only one row * was found. * * @param mixed $key The value(s) of the primary keys. * @return SplFixedArray Row(s) matching the criteria. * @throws DataObjectException */ public static function find() { $args = func_get_args(); $keyNames = array_values(static::$_primary); if (count($args) != count($keyNames)) { //require_once 'Zend/Db/Table/Exception.php'; throw new DataObjectException("Too few or too many columns for the primary key"); } $whereList = array(); $numberTerms = 0; foreach ($args as $keyPosition => $keyValues) { $keyValuesCount = count($keyValues); // Coerce the values to an array. // Don't simply typecast to array, because the values // might be Expr objects. if (!is_array($keyValues)) { $keyValues = array($keyValues); } if ($numberTerms == 0) { $numberTerms = $keyValuesCount; } else { if ($keyValuesCount != $numberTerms) { //require_once 'Zend/Db/Table/Exception.php'; throw new DataObjectException("Missing value(s) for the primary key"); } } $keyValues = array_values($keyValues); for ($i = 0; $i < $keyValuesCount; ++$i) { if (!isset($whereList[$i])) { $whereList[$i] = array(); } $whereList[$i][$keyPosition] = $keyValues[$i]; } } $whereClause = null; if (count($whereList)) { $whereOrTerms = array(); $tableName = static::$_db->quoteTableAs(static::$_name, null, true); foreach ($whereList as $keyValueSets) { $whereAndTerms = array(); foreach ($keyValueSets as $keyPosition => $keyValue) { //$type = $this->_metadata[$keyNames[$keyPosition]]['DATA_TYPE']; $columnName = static::$_db->quoteIdentifier($keyNames[$keyPosition], true); $whereAndTerms[] = static::$_db->quoteInto($tableName . '.' . $columnName . ' = ?', $keyValue); //, $type FIXME 这个暂时无解,通通当成字符串处理吧 } $whereOrTerms[] = '(' . implode(' AND ', $whereAndTerms) . ')'; } $whereClause = '(' . implode(' OR ', $whereOrTerms) . ')'; } // issue ZF-5775 (empty where clause should return empty rowset) if ($whereClause == null) { return new \SplFixedArray(0); } return static::fetchAll($whereClause); }
/** * Fetches rows by primary key. The argument specifies one or more primary * key value(s). To find multiple rows by primary key, the argument must * be an array. * * This method accepts a variable number of arguments. If the table has a * multi-column primary key, the number of arguments must be the same as * the number of columns in the primary key. To find multiple rows in a * table with a multi-column primary key, each argument must be an array * with the same number of elements. * * The find() method always returns a Rowset object, even if only one row * was found. * * @param mixed $key The value(s) of the primary keys. * @return Statement Row(s) matching the criteria. * @throws DataObjectException */ public function find() { $args = func_get_args(); $keyNames = array_values($this->_primary); if (count($args) != count($keyNames)) { throw new DataObjectException("Too few or too many columns for the primary key"); } $whereList = []; $numberTerms = 0; foreach ($args as $keyPosition => $keyValues) { $keyValuesCount = count($keyValues); // Coerce the values to an array. // Don't simply typecast to array, because the values // might be Expr objects. if (!is_array($keyValues)) { $keyValues = array($keyValues); } if ($numberTerms == 0) { $numberTerms = $keyValuesCount; } else { if ($keyValuesCount != $numberTerms) { throw new DataObjecgtException("Missing value(s) for the primary key"); } } $keyValues = array_values($keyValues); for ($i = 0; $i < $keyValuesCount; ++$i) { if (!isset($whereList[$i])) { $whereList[$i] = []; } $whereList[$i][$keyPosition] = $keyValues[$i]; } } if (count($whereList) === 0) { // empty where clause should return empty rowset throw new SelectException('Where clause is empty.'); } $whereOrTerms = []; $tableName = $this->_db->quoteTableAs($this->_name, null, true); foreach ($whereList as $keyValueSets) { $whereAndTerms = []; foreach ($keyValueSets as $keyPosition => $keyValue) { //$type = $this->_metadata[$keyNames[$keyPosition]]['DATA_TYPE']; $columnName = $this->_db->quoteIdentifier($keyNames[$keyPosition], true); $whereAndTerms[] = $this->_db->quoteInto($tableName . '.' . $columnName . ' = ?', $keyValue); } $whereOrTerms[] = '(' . implode(' AND ', $whereAndTerms) . ')'; } return $this->select()->where(implode(' OR ', $whereOrTerms))->yieldAll(); }