Doctrine orm 如何将ArrayCollection传递给doctrinModule\Form\Element\ObjectSelect

Doctrine orm 如何将ArrayCollection传递给doctrinModule\Form\Element\ObjectSelect,doctrine-orm,zend-framework2,zend-form,Doctrine Orm,Zend Framework2,Zend Form,我尝试了几乎所有我在这里和谷歌搜索找到的东西,但仍然没有运气 我的用户实体与许多国家有很多关系,如下所示: /** * @var \Doctrine\Common\Collections\Collection * @ORM\ManyToMany(targetEntity="Admin\Entity\Country", cascade={"persist", "remove"}) * @ORM\JoinTable(name="user_country_linker", * joi

我尝试了几乎所有我在这里和谷歌搜索找到的东西,但仍然没有运气

我的用户实体与许多国家有很多关系,如下所示:

/**
 * @var \Doctrine\Common\Collections\Collection
 * @ORM\ManyToMany(targetEntity="Admin\Entity\Country", cascade={"persist", "remove"})
 * @ORM\JoinTable(name="user_country_linker",
 *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="country_id", referencedColumnName="id")}
 * )
 */
protected $countries;
现在,我正试图显示DoctrineModule\Form\Element\ObjectSelect,仅显示允许/指定的国家/地区。通过调用$this->zfcUserAuthentication()->getIdentity()->getCountries(),我确实有了这个列表

有没有办法将此ArrayCollection传递给ObjectSelect表单元素

$this->add(array(
        'name' => 'country',
        'type' => 'DoctrineModule\Form\Element\ObjectSelect',
        'options' => array(
            'label'             => 'Country',
            'object_manager'    => $em,
            'target_class'      => '\Admin\Entity\Country',
            'property'          => 'code',
            'find_method'       => array(
                'name' => 'findBy',
                'params' => array(
                    'criteria' => array(),
                    'orderBy' => array('id' => 'asc'),
                ),
            ),
            'column-size' => 'sm-10',
            'label_attributes' => array('class' => 'col-sm-2'),
            'help-block' => 'Select country where the entity is present'
        ),
        'attributes' => array(
            'required' => false
        )
    ));

非常感谢你的帮助,我真的很感激

如何在控制器中填充下拉列表最好在此处进行说明:。这基本上是AlexP的解决方案

如果这不是你想要的,也许这篇文章描述的方法可以帮助你。至少它可以帮助像我这样正在寻找这样的解决方案的其他人:

基本上,您可以创建一个自定义reposity,其中包含一个自定义查询以检索可能的解决方案:

namespace Your\Repository;


    use Doctrine\ORM\EntityRepository;

    class CountriesRepository extends EntityRepository
    {
        public function getPossibleCountries()
        {
            $querybuilder = $this->_em
                                 ->getRepository($this->getEntityName())
                                 ->createQueryBuilder('c');
            return $querybuilder->select('c')//... define your query here
                        ->getQuery()->getResult();
        }
    }
然后,您可以在ObjectSelect中引用该方法:

            $this->add(array(
               'name' => 'continent',
               'type' => 'DoctrineModule\Form\Element\ObjectSelect',
               'options' => array(
                    'object_manager'     => $this->entityManager,
                    'target_class'       => 'Your\Entity\User',
                    'property' => 'contries',
                    'is_method' => true,
                    'find_method'        => array(
                        'name'   => 'getCountries',
                    ),
                ), 
            ));

我想您在用户实体中有国家/地区。只需使用用户实体的关系。您好,谢谢您的评论,但我不明白:(是的,'countries'位于用户实体中,但我希望将ObjectSelect的源设置为$ZfcuseIdentity,因为它包含当前登录用户允许的国家/地区。@cptnk我忘记在上面的评论中添加您了…我不完全确定ObjectSelect是否是解决此问题的最佳方法。毕竟,您在这里有一个角色依赖项。@cptnkd“查找方式”似乎是筛选select中内容的唯一可能方式。据我所知,对象select只是通过对象存储库通过ORM填充select。我可能会尝试创建自己的表单元素()。如果您已经有了带有所需实体的
集合
,那么使用
DoctrineModule\Form\Element\ObjectSelect
就没有意义了,因为它只会通过ObjectManager再次加载集合。为什么不将
集合
转换为assoc数组,并将其设置为标准上的
值选项
select元素?这似乎正是我所需要的,但还有一件事-我如何从表单中将参数传递给getCountries()?~基本上,如果我想使用带有更多过滤国家的自定义函数?