Подтвердить что ты не робот

Пользовательский класс репозитория в symfony2

Я новичок в symfony2.I создал класс репозитория, когда я создал класс сущности через командную строку. Но я не смог получить доступ к своим пользовательским функциям в этом классе репозитория. как создать пользовательский класс репозитория в 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!

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

 /*
 * User
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Acme\DemoBundle\Entity\UserRepository")
 */
class User
{
...
}`   

Ответ 4

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/en/latest/cookbook/mapping-classes-to-orm-and-odm.html Затем обновите кеш:

php app/console doctrine:cache:clear-metadata
php app/console cache:clear

Ответ 5

Прежде всего вам не нужно настраивать репо, чтобы сделать это. Вы можете установить порядок order by в методе find get get: метод EM getRepository:

//$em - entity manager
//from Doctrine documentation: findBy(criteria(array), order(array), limit, offset)
$result = $em->getRepository('symBundle:Register')->findBy(array(), array('name' => 'ASC'))

Ответ 6

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

protected $products;

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

для Category.php и

protected $category;

для Product.php

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