方法名称必须以 findBy 或 findOneBy 开头!错误

The method name must start with either findBy or findOneBy! error

我有一个 table 与 Application\Sonata\MediaBundle\Entity\Media(SonataMediaBundle 实体)有关系 'media'

通常我可以像下面这样为媒体制作表格,

    $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 有关。 但是我不确定我应该指向哪个存储库。 THERE 下没有 Repository class 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;

顺便说一句,我的第一个代码只显示 select 图片框(媒体)

select图片不够用, select图片有没有更合适table的方法?

看错误,createQuery方法不存在

如果您看一下 EntityRepository class,您会发现正确的方法是 createQueryBuilder()

如果您查看该方法的内容,您会发现它 returns 一个 QueryBuilder 实例,其中已经包含正确的 select from 语句,因为您应该得到正确的由于您在 class 选项中传递了实体的 class,因此您的媒体实体的存储库来自 Entity 表单类型。

您已将 $er 定义为 $this->getDoctrine()->getRepository('Application\Sonata\MediaBundle\Entity:Media'),即 EntityRepository。您需要的是 $this->getDoctrine()->getManager() 的 EntityManager,然后使用代码段中的 select 语句。希望对您有所帮助!