2013-03-02 3 views
4

Я последовал пример настройки функции пользовательского findOneByJoinedToCategory ($ ID) в классе модели доктрины, как описано в документации здесь:Symfony2 отклоняя мою пользовательскую функцию findBy в моем классе модели

http://symfony.com/doc/current/book/doctrine.html

В мой случай, у меня есть класс модели под названием TestVendorCategory, содержащая кучу атрибутов и эту функцию:

public function findOneByNameJoinedToVendorCategoryMappings($vendorCategoryName) 
    { 
     $query = $this->getEntityManager() 
     ->createQuery(' 
       SELECT vc, vcm FROM TestCoreBundle:VendorCategory vc 
       JOIN vcm.vendorCategoryMapping vcm 
       WHERE vc.name = :name' 
     )->setParameter('name', $vendorCategoryName); 

     try 
     { 
      return $query->getSingleResult(); 
     } 
     catch (\Doctrine\ORM\NoResultException $e) 
     { 
      return null; 
     } 
    } 

В моем контроллере, я называю это так:

$vendorCategoryMapping = $this->em->getRepository("TestCoreBundle:VendorCategory")->findOneByNameJoinedToVendorCategoryMappings($vendorCategoryName); 

Когда я иду в браузер и выполнить это действие с этим вызовом в нем, я получаю следующее сообщение об ошибке:

организации «Test \ CoreBundle \ Entity \ VendorCategory» имеет «nameJoinedToVendorCategoryMappings» никакого поля. Поэтому вы не можете называть «findOneByNameJoinedToVendorCategoryMappings» в репозитории сущностей

Похоже, что Symfony 2.1 хочет, чтобы методы findOneBy ...() отображали только имена существующих полей, а не специальные методы «JoinTo ...» , Мне что-то не хватает, пожалуйста? В документации показан пример, например, где он работает. Я использую аннотации, но этот метод не имеет. Спасибо!

ответ

5

Вы должны поставить функцию findOneByNameJoinedToVendorCategoryMappings в классе VendorCategoryRepository:

<?php 
namespace Test\CoreBundle\Entity; 

use Doctrine\ORM\EntityRepository; 
use Doctrine\ORM\NoResultException; 

class VendorCategoryRepository extends EntityRepository 
{ 
    public function findOneByNameJoinedToVendorCategoryMappings($vendorCategoryName) 
    { 
     $query = $this->getEntityManager() 
      ->createQuery(' 
      SELECT vc, vcm FROM TestCoreBundle:VendorCategory vc 
      JOIN vcm.vendorCategoryMapping vcm 
      WHERE vc.name = :name' 
     )->setParameter('name', $vendorCategoryName); 

     try 
     { 
      return $query->getSingleResult(); 
     } 
     catch (NoResultException $e) 
     { 
      return null; 
     } 
    } 
} 

и связать этот класс репозитория в Entity:

/** 
* @ORM\Entity(repositoryClass="Test\CoreBundle\Entity\VendorCategoryRepository") 
*/ 
class VendorCategory 
+1

Добро пожаловать! Я однажды забыл ссылаться на класс репозитория в сущности и задавался вопросом, почему мои пользовательские функции не работают. Вам не обязательно следить за поиском ... convention btw .. Обычно я использую getXY, чтобы отличать настраиваемые методы от стандартных. – hacfi

Смежные вопросы