2017-01-31 7 views
0

У меня есть таблица, которая имеет связь с Application \ соната \ MediaBundle \ Entity \ Media (SonataMediaBundle Entity) в качестве 'средства массовой информации'Имя метода должно начинаться с findBy или findOneBy! Ошибка

Обычно я могу сделать форму для средств массовой информации, как это ниже,

$form = $this->createFormBuilder($myMedia) 
    ->add('name') 
    ->add('media') // make the selectbox 
    ->add('save', SubmitType::class, array('label' => 'Create Post')) 
    ->getForm(); 

Однако я хочу ограничить некоторые медийные средства из всех медиа, затем я сделал это.

$form = $this->createFormBuilder($myMedia) 
    ->add('name') 
    ->add('media','entity',array(
      'class' => "Application\Sonata\MediaBundle\Entity\Media", 
      'query_builder' => function(EntityRepository $er) { 
        return $er->createQuery('SELECT r FROM ApplicationSonataMediaBundle:Media'); 
      })) 
    ->add('save', SubmitType::class, array('label' => 'Create Post')) 
    ->getForm(); 

Однако он показывает эту ошибку.

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

Я нашел некоторые articles и понял, что это связано с Repository. Но я не уверен, какой репозиторий я должен указать. Там нет Repository класса под Sonata\MediaBundle\ либо Application\Sonata\MediaBundle

namespace Application\Sonata\MediaBundle\Entity;  
use Sonata\MediaBundle\Entity\BaseMedia as BaseMedia; 

@ORM\Entity(repositoryClass="Where is my repository???") 

class Media extends BaseMedia 
{ 
    /** 
    * @var int $id 
    */ 
    protected $id; 

Кстати, мой первый код показывает только поле выбора снимков (медиа)

Это не является достаточно полезным для выбора снимков, Есть ли более подходящий способ выбора изображений?

+0

Поиск в папке проекта с ключевым словом MediaRepository. Когда вы обнаружите, что это пространство имен и введите его. –

ответ

1

Посмотрите на ошибку, метод createQuery не существует.

Если вы посмотрите на класс EntityRepository, вы увидите, что правильный метод - createQueryBuilder().

Если вы посмотрите на содержании методы вы увидите, что она возвращает QueryBuilder экземпляра с уже правой select from заявления, так как вы должны получить право хранилища для медиа-объекта от типа Entity формы, так как вы передаете класс вашего объекта в опции class.

+0

Большое спасибо. Я проверил класс Doctorine/ORM/EntityRepository и понял, что вы имели в виду. Я еще не уверен, как использовать createQuery() вместо createQueryBuilder(), хотя теперь createQueryBuilder() выполняет мою задачу. – whitebear

+0

CreateQuery - это метод класса 'EntityManager'. Класс 'EntityRepository' имеет метод' getEntityManager() ', но он защищен, поэтому вы не можете его вызвать извне. – Mawcel

-1

Вы определили $ er как $this->getDoctrine()->getRepository('Application\Sonata\MediaBundle\Entity:Media'), который является EntityRepository. Скорее всего, это EntityManager, который равен $this->getDoctrine()->getManager(), а затем используйте оператор select, который у вас есть в куске кода. Надеюсь, поможет!

+0

' $ this-> getDoctrine() -> getManager() 'может вызываться в контроллере, но это замыкание в виде типа. Он принимает репозиторий объекта как параметр замыкания, поскольку всегда выполняется обратный вызов из опции 'query_builder'. – Mawcel