Magic doctrines2, when does the field have an underline?

I'm having problems using Doctrine2's magic find*() methods when the field has an underscore .

 $repository->findByName("Hello"); // Works $repository->findByIsEnabled(true); 

Entity 'Acme \ SecurityBundle \ Entity \ Package' does not have a 'isEnabled' field. Therefore, you cannot call the 'findByIsEnabled' store.

This is a simple entity definition in YAML for error replication:

 Acme\SecurityBundle\Entity\Package: type: entity repositoryClass: Acme\SecurityBundle\Repository\PackageRepository table: security_package id: id: type: integer generator: { strategy: AUTO } fields: name: type: string length: 255 unique: true is_enabled: type: boolean 
+4
source share
1 answer

I remember that I had the same problem and thought I solved it by writing something like this:

$ repository-> findBy (array ('is_enabled' => true));

Take a look at the code:

 <?php /** * 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); } } 

The key line is here:

 $fieldName = lcfirst(\Doctrine\Common\Util\Inflector::classify($by)); 

Now let's see how to classify:

 <?php /** * Convert a word in to the format for a Doctrine class name. Converts 'table_name' to 'TableName' * * @param string $word Word to classify * @return string $word Classified word */ public static function classify($word) { return str_replace(" ", "", ucwords(strtr($word, "_-", " "))); } 

It looks like you should write your "likeThis" fields if you want this to work.

+16
source

Source: https://habr.com/ru/post/1400895/


All Articles