2017-01-31 14 views
0

私は、アプリケーション\ソナタ\ MediaBundle \エンティティ\メディア(SonataMediaBundleエンティティ)との関係を持つテーブルを持っている「メディア」メソッド名は、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、それはリポジトリに関連して理解しています。 しかし、どのリポジトリを指すべきかはわかりません。そこにはリポジトリクラスは 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; 

ところで、私の最初のコードは写真のための唯一の選択ボックス(MEDIAS)

を示し写真を選択するには十分有用ではありません、 があります写真を選択するより適切な方法?

+0

MediaRepositoryキーワードでプロジェクトフォルダ内を検索してください。あなたが名前空間を見つけたら、それをタイプしてください。 –

答えて

1

エラーを見て、createQueryメソッドが存在しません。

EntityRepositoryクラスを見ると、適切なメソッドがcreateQueryBuilder()であることがわかります。

あなたがメソッドの内容を見れば、あなたは合格するので、あなたがEntityフォームタイプからあなたのメディアエンティティのための右のリポジトリを取得することになっているので、それはすでに右select from文でQueryBuilderインスタンスを返すことがわかりますclassオプションのエンティティのクラスです。

+0

ありがとうございました。私はDoctorine/ORM/EntityRepositoryクラスをチェックして、あなたが何を意味するのか理解しました。私はまだ私はcreateQueryBuilder()の代わりにcreateQuery()を使用することはできませんが、今のところcreateQueryBuilder()は私の目的を果たしています。 – whitebear

+0

CreateQueryは 'EntityManager'クラスのメソッドです。 'EntityRepository'クラスは' getEntityManager() 'メソッドを持っていますが、外部から呼び出せないように保護されています – Mawcel

-1

$ erをEntityRepositoryである$this->getDoctrine()->getRepository('Application\Sonata\MediaBundle\Entity:Media')と定義しました。あなたが必要とするものは、$this->getDoctrine()->getManager()のEntityManagerです。次に、コードの中にあるselectステートメントを使用します。それが役に立てば幸い!

+0

' $ this-> getDoctrine() - > getManager() 'はコントローラで呼び出すことができます。フォームタイプのクロージャです。彼は、 'query_builder'オプションからのコールバックが常に行うように、クロージャのパラメータとしてエンティティリポジトリを受け取ります。 – Mawcel

関連する問題