Magic Doctrine2 finders when field has underscore?

前端 未结 1 797
忘了有多久
忘了有多久 2021-01-13 09:01

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

$repository->find         


        
相关标签:
1条回答
  • 2021-01-13 09:48

    I recall having had the same problem and think I solved it by writing something like this :

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

    Let's 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 have a look 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're supposed to write your fields "likeThis" if you want this to work.

    0 讨论(0)
提交回复
热议问题