Пользовательский класс репозитория в 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!
Есть ли у меня ошибка в коде? Любая ошибка при создании класса репозитория? мне нужно было использовать любой класс.
Ответы
Ответ 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
, которые успешно добавляют новые геттеры и сеттеры