пользовательский класс репозитория в symfony2 - PullRequest
31 голосов
/ 16 ноября 2011

Я новичок в symfony2.Я создал класс репозитория, когда создал класс сущностей через командную строку. Но я не смог получить доступ к своим пользовательским функциям в этом классе репозитория. Как создать собственный класс репозитория в Symfony2? Кто-нибудь может дать мне пошаговое объяснение с нуля с примером кода?

Ниже мой класс хранилища

namespace Mypro\symBundle\Entity;

use Doctrine\ORM\EntityRepository;

/**
 * RegisterRepository
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class RegisterRepository extends EntityRepository
{


    public function findAllOrderedByName()
    {
        return $this->getEntityManager()
            ->createQuery('SELECT p FROM symBundle:Register p ORDER BY p.name ASC')
            ->getResult();
    }


}

Я звонил своему контроллеру вот так

$em = $this->getDoctrine()->getEntityManager();
          $pro = $em->getRepository('symBundle:Register')
            ->findAllOrderedByName();

Я получил ошибку ниже

Undefined method 'findAllOrderedByName'. The method name must start with either findBy or findOneBy!

Есть ли у меня ошибка в моем коде? Любая ошибка в создании класса репозитория? нужно ли мне использовать какой-либо класс.

Ответы [ 6 ]

69 голосов
/ 16 ноября 2011

Я думаю, вы просто забыли зарегистрировать этот репозиторий в вашей сущности.Вы просто должны добавить в свой файл конфигурации сущности класс хранилища.

В src / Mypro / symBundle / Resources / config / doctrine / Register.orm.yml:

Mypro\symBundle\Entity\Register:
    type: entity
    repositoryClass: Mypro\symBundle\Entity\RegisterRepository

Don 'не забудьте очистить кэш после этого изменения, на всякий случай.

И если вы используете аннотации (вместо конфигурации yml), то вместо вышеупомянутого добавьте что-то вроде:

/**
 * @ORM\Entity(repositoryClass="Mypro\symBundle\Entity\RegisterRepository")
*/

в ваш класс Entity для регистрации репозитория

6 голосов
/ 16 ноября 2011

В руководстве есть хорошее пошаговое руководство ... http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes

  • Сначала определите класс репозитория в конфигурации аннотации / yaml
  • Создать класс
  • Создать функцию
  • Затем вызовите вновь созданную функцию ....
4 голосов
/ 02 мая 2014

xml для отображения: Обновите файл сопоставления xml в папке Resource / config / doctrine, добавьте атрибут класса репозитория:

<entity name="Ccd\Bundle\FrontendBundle\Entity\UvUpdatePageContent" table="uv_update_page_content" repository-class="Ccd\Bundle\FrontendBundle\Entity\UvUpdatePageContentRepository">

http://doctrine -mongodb-odm.readthedocs.org / о / последние / кулинарный / отображение-классы-к-ОРМ-и-odm.html Затем обновите кеш:

php app/console doctrine:cache:clear-metadata
php app/console cache:clear
4 голосов
/ 18 июня 2013

Я тоже потерял много времени, когда попал в этот беспорядок конфигурации. Я настраивал класс репозитория в моем Entity как отображение аннотации. Сопоставление было, но хранилище не было связано с сущностью. Когда я переместил отображение аннотации, т.е. @ORM \ Entity (repositoryClass = "Acme \ DemoBundle \ Entity \ UserRepository"), до последней строки это работало.

 /*
 * User
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Acme\DemoBundle\Entity\UserRepository")
 */
class User
{
...
}`   
2 голосов
/ 26 июля 2013

Я просто следую нативной документации doc и ищу аннотацию, которую я выбрал. Например, я выбрал yaml, добавил конфигурации в файлы Product.orm.yml и Category.orm.yml, а также добавил новые атрибуты php в методы Entity:

protected $products;

public function __construct()
{
    $this->products = new ArrayCollection();
}

для Category.php и

protected $category;

для Product.php

затем запустите php app/console doctrine:generate:entities Acme , которые успешно добавляют новые методы получения и установки

2 голосов
/ 14 января 2013

Прежде всего вам не нужно настраивать репо для этого .. Вы можете установить порядок по выражению в EM getRepository findBy метод:

//$em - entity manager
//from Doctrine documentation: findBy(criteria(array), order(array), limit, offset)
$result = $em->getRepository('symBundle:Register')->findBy(array(), array('name' => 'ASC'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...