/** * Adds support for magic finders. * * @return array|object The found entity/entities. * @throws BadMethodCallException If the method called is an invalid find* method * or no find* method at all and therefore an invalid * method call. */ public function __call($method, $arguments) { switch (true) { case 0 === strpos($method, 'findBy'): $by = substr($method, 6); $method = 'findBy'; break; case 0 === strpos($method, 'findOneBy'): $by = substr($method, 9); $method = 'findOneBy'; break; default: throw new \BadMethodCallException("Undefined method '{$method}'. The method name must start with " . "either findBy or findOneBy!"); } if (empty($arguments)) { throw ORMException::findByRequiresParameter($method . $by); } $fieldName = lcfirst(\Doctrine\Common\Util\Inflector::classify($by)); if ($this->_class->hasField($fieldName) || $this->_class->hasAssociation($fieldName)) { switch (count($arguments)) { case 1: return $this->{$method}(array($fieldName => $arguments[0])); case 2: return $this->{$method}(array($fieldName => $arguments[0]), $arguments[1]); case 3: return $this->{$method}(array($fieldName => $arguments[0]), $arguments[1], $arguments[2]); case 4: return $this->{$method}(array($fieldName => $arguments[0]), $arguments[1], $arguments[2], $arguments[3]); default: // Do nothing } } throw ORMException::invalidFindByCall($this->_entityName, $fieldName, $method . $by); }
/** * Adds support for magic finders. * * @return array|object The found entity/entities. * @throws BadMethodCallException If the method called is an invalid find* method * or no find* method at all and therefore an invalid * method call. */ public function __call($method, $arguments) { if (substr($method, 0, 6) == 'findBy') { $by = substr($method, 6, strlen($method)); $method = 'findBy'; } else { if (substr($method, 0, 9) == 'findOneBy') { $by = substr($method, 9, strlen($method)); $method = 'findOneBy'; } else { throw new \BadMethodCallException("Undefined method '{$method}'. The method name must start with " . "either findBy or findOneBy!"); } } if (!isset($arguments[0])) { // we dont even want to allow null at this point, because we cannot (yet) transform it into IS NULL. throw ORMException::findByRequiresParameter($method . $by); } $fieldName = lcfirst(\Doctrine\Common\Util\Inflector::classify($by)); if ($this->_class->hasField($fieldName) || $this->_class->hasAssociation($fieldName)) { return $this->{$method}(array($fieldName => $arguments[0])); } else { throw ORMException::invalidFindByCall($this->_entityName, $fieldName, $method . $by); } }
/** * Resolves a magic method call to the proper existent method at `EntityRepository`. * * @param string $method The method to call * @param string $by The property name used as condition * @param array $arguments The arguments to pass at method call * * @throws ORMException If the method called is invalid or the requested field/association does not exist * * @return mixed */ private function resolveMagicCall($method, $by, array $arguments) { if (!$arguments) { throw ORMException::findByRequiresParameter($method . $by); } $fieldName = lcfirst(Inflector::classify($by)); if (!($this->_class->hasField($fieldName) || $this->_class->hasAssociation($fieldName))) { throw ORMException::invalidMagicCall($this->_entityName, $fieldName, $method . $by); } return $this->{$method}([$fieldName => $arguments[0]], ...array_slice($arguments, 1)); }