2017-01-31 5 views
0

Ich habe eine Tabelle, dieDer Methodenname muss entweder mit findBy oder findOneBy beginnen! Fehler

Normalerweise Beziehung mit Application \ Sonata \ MediaBundle \ Entity \ Media (SonataMediaBundle Entity) als 'Medien' hat, kann ich das Formular für Medien wie dies unten machen,

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

Allerdings möchte ich auf einige Medien aus allen Medien beschränken, dann habe ich das gemacht.

$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(); 

Allerdings zeigt es den Fehler so.

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

Ich habe einige articles und verstanden gefunden ist es mit Repository bezogen. Aber ich bin mir nicht sicher, auf welches Repository ich hinweisen soll. Es gibt keine Repository-Klasse unter Sonata\MediaBundle\ entweder 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; 

BTW, mein erster Code zeigt nur Auswahlbox für Bilder (Medien)

Es ist nicht sinnvoll genug ist, Bilder zu wählen, Gibt es eine geeignetere Art für die Auswahl von Bildern?

+0

Suche im Projektordner mit Schlüsselwort MediaRepository. Wenn Sie es finden, suchen Sie Namespace und geben Sie es ein. –

Antwort

1

Schauen Sie sich den Fehler an, die createQuery Methode existiert nicht. Wenn Sie sich die Klasse EntityRepository ansehen, werden Sie sehen, dass die richtige Methode createQueryBuilder() ist.

Wenn Sie den Inhalt des Verfahrens aussehen werden Sie sehen, dass es eine QueryBuilder Instanz mit bereits rechts select from Anweisung gibt, da Sie angeblich den richtigen Aufbewahrungsort für Ihre Medien-Einheit aus dem Entity Formulartyp erhalten, da Sie weitergeben die Klasse Ihres Unternehmens in der class Option.

+0

Vielen Dank. Ich habe die Doctorine/ORM/EntityRepository-Klasse überprüft und verstanden, was Sie meinten. Ich bin mir noch nicht sicher, wie kann ich createQuery() anstelle von createQueryBuilder() verwenden, denn jetzt erfüllt createQueryBuilder() meinen Zweck. – whitebear

+0

CreateQuery ist eine Methode aus der 'EntityManager' Klasse. Die 'EntityRepository' Klasse hat eine' getEntityManager() 'Methode, aber sie ist geschützt, so dass Sie sie nicht von außerhalb aufrufen können. – Mawcel

-1

Sie haben $ er als $this->getDoctrine()->getRepository('Application\Sonata\MediaBundle\Entity:Media') definiert, das EntityRepository. Was Sie stattdessen brauchen, ist der EntityManager, der $this->getDoctrine()->getManager() ist, und verwenden Sie dann die Select-Anweisung, die Sie in dem Codeabschnitt haben. Ich hoffe es hilft!

+0

' $ this-> getDoctrine() -> getManager() 'kann in einem Controller aufgerufen werden, aber dies ist eine Closure in einem Formulartyp. Er empfängt das Entitätsrepository als Parameter des Closures, wie es der Callback aus der Option 'query_builder' immer tut. – Mawcel

Verwandte Themen