Doctrine orm 如何在ZF2和条令中引用多对一关系中的子元素

Doctrine orm 如何在ZF2和条令中引用多对一关系中的子元素,doctrine-orm,zend-framework2,zend-form,many-to-one,zend-form-element,Doctrine Orm,Zend Framework2,Zend Form,Many To One,Zend Form Element,如果我使用ZF2和条令开发一个项目,该项目使用类似于此的多对多关系,父字段集将如下所示: namespace Application\Form; use Application\Entity\BlogPost; use Doctrine\Common\Persistence\ObjectManager; use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator; use Zend\Form\Fieldset; u

如果我使用ZF2和条令开发一个项目,该项目使用类似于此的多对多关系,父字段集将如下所示:

namespace Application\Form;

use Application\Entity\BlogPost;
use Doctrine\Common\Persistence\ObjectManager;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use Zend\Form\Fieldset;
use Zend\InputFilter\InputFilterProviderInterface;

class BlogPostFieldset extends Fieldset implements InputFilterProviderInterface
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('blog-post');

        $this->setHydrator(new DoctrineHydrator($objectManager))
             ->setObject(new BlogPost());

        $this->add(array(
            'type' => 'Zend\Form\Element\Text',
            'name' => 'title'
        ));

        $tagFieldset = new TagFieldset($objectManager);
        $this->add(array(
            'type'    => 'Zend\Form\Element\Collection',
            'name'    => 'tags',
            'options' => array(
                'count'           => 2,
                'target_element' => $tagFieldset
            )
        ));
    }

    public function getInputFilterSpecification()
    {
        return array(
            'title' => array(
                'required' => true
            ),
        );
    }
}
// edit.phtml:

// ...

$bpfs=$form->get('blog-post');
$tfss=$bpfs->get('tags')->getFieldsets();
$tfs=$tfss[0];

$tagName = $tfs->get('name');

// ...
$tagFieldset = new TagFieldset($objectManager);
$this->add(array(
    'name'    => 'tag',
    'options' => array(
        'target_element' => $tagFieldset
    )
));
// edit.phtml:

// ...

$bpfs=$form->get('blog-post');
$tfs=$bpfs->get('tag')->getFieldsets();

$tagName = $tfs->get('name');

// ...
可以在视图中访问表单元素,如下所示:

namespace Application\Form;

use Application\Entity\BlogPost;
use Doctrine\Common\Persistence\ObjectManager;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use Zend\Form\Fieldset;
use Zend\InputFilter\InputFilterProviderInterface;

class BlogPostFieldset extends Fieldset implements InputFilterProviderInterface
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('blog-post');

        $this->setHydrator(new DoctrineHydrator($objectManager))
             ->setObject(new BlogPost());

        $this->add(array(
            'type' => 'Zend\Form\Element\Text',
            'name' => 'title'
        ));

        $tagFieldset = new TagFieldset($objectManager);
        $this->add(array(
            'type'    => 'Zend\Form\Element\Collection',
            'name'    => 'tags',
            'options' => array(
                'count'           => 2,
                'target_element' => $tagFieldset
            )
        ));
    }

    public function getInputFilterSpecification()
    {
        return array(
            'title' => array(
                'required' => true
            ),
        );
    }
}
// edit.phtml:

// ...

$bpfs=$form->get('blog-post');
$tfss=$bpfs->get('tags')->getFieldsets();
$tfs=$tfss[0];

$tagName = $tfs->get('name');

// ...
$tagFieldset = new TagFieldset($objectManager);
$this->add(array(
    'name'    => 'tag',
    'options' => array(
        'target_element' => $tagFieldset
    )
));
// edit.phtml:

// ...

$bpfs=$form->get('blog-post');
$tfs=$bpfs->get('tag')->getFieldsets();

$tagName = $tfs->get('name');

// ...
但是,如果我想使用多对一关系,我不知道如何对子元素进行编码。在
BlogPost字段集
中,我假设
标记
元素不再是一个集合,因为只有一个集合。但是标记仍然是一个字段集,所以我猜它会进入
BlogPost字段集
,如下所示:

namespace Application\Form;

use Application\Entity\BlogPost;
use Doctrine\Common\Persistence\ObjectManager;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use Zend\Form\Fieldset;
use Zend\InputFilter\InputFilterProviderInterface;

class BlogPostFieldset extends Fieldset implements InputFilterProviderInterface
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('blog-post');

        $this->setHydrator(new DoctrineHydrator($objectManager))
             ->setObject(new BlogPost());

        $this->add(array(
            'type' => 'Zend\Form\Element\Text',
            'name' => 'title'
        ));

        $tagFieldset = new TagFieldset($objectManager);
        $this->add(array(
            'type'    => 'Zend\Form\Element\Collection',
            'name'    => 'tags',
            'options' => array(
                'count'           => 2,
                'target_element' => $tagFieldset
            )
        ));
    }

    public function getInputFilterSpecification()
    {
        return array(
            'title' => array(
                'required' => true
            ),
        );
    }
}
// edit.phtml:

// ...

$bpfs=$form->get('blog-post');
$tfss=$bpfs->get('tags')->getFieldsets();
$tfs=$tfss[0];

$tagName = $tfs->get('name');

// ...
$tagFieldset = new TagFieldset($objectManager);
$this->add(array(
    'name'    => 'tag',
    'options' => array(
        'target_element' => $tagFieldset
    )
));
// edit.phtml:

// ...

$bpfs=$form->get('blog-post');
$tfs=$bpfs->get('tag')->getFieldsets();

$tagName = $tfs->get('name');

// ...
(它是一条记录,因此我将名称更改为
标记
。它不是集合,也不是任何其他ZF2表单元素,因此我删除了
类型
属性语句。)

然后在视图中,我尝试如下访问表单元素:

namespace Application\Form;

use Application\Entity\BlogPost;
use Doctrine\Common\Persistence\ObjectManager;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use Zend\Form\Fieldset;
use Zend\InputFilter\InputFilterProviderInterface;

class BlogPostFieldset extends Fieldset implements InputFilterProviderInterface
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('blog-post');

        $this->setHydrator(new DoctrineHydrator($objectManager))
             ->setObject(new BlogPost());

        $this->add(array(
            'type' => 'Zend\Form\Element\Text',
            'name' => 'title'
        ));

        $tagFieldset = new TagFieldset($objectManager);
        $this->add(array(
            'type'    => 'Zend\Form\Element\Collection',
            'name'    => 'tags',
            'options' => array(
                'count'           => 2,
                'target_element' => $tagFieldset
            )
        ));
    }

    public function getInputFilterSpecification()
    {
        return array(
            'title' => array(
                'required' => true
            ),
        );
    }
}
// edit.phtml:

// ...

$bpfs=$form->get('blog-post');
$tfss=$bpfs->get('tags')->getFieldsets();
$tfs=$tfss[0];

$tagName = $tfs->get('name');

// ...
$tagFieldset = new TagFieldset($objectManager);
$this->add(array(
    'name'    => 'tag',
    'options' => array(
        'target_element' => $tagFieldset
    )
));
// edit.phtml:

// ...

$bpfs=$form->get('blog-post');
$tfs=$bpfs->get('tag')->getFieldsets();

$tagName = $tfs->get('name');

// ...
但这会产生错误

Fatal error: Call to undefined method Zend\Form\Element::getFieldsets() in …

该如何正确编码?

既然
标记
只是一个字段集,您应该这样做:

$tfs=$bpfs->get('tag'); 
$tagName = $tfs->get('name');