Doctrine 2 ORM Zend 2形成多对多的例子

时间:2013-09-10 15:41:57

标签: doctrine-orm zend-framework2 zend-form

对于使用ZF2和Doctrine 2的多对多关系,任何人都有一个很好的完整示例,尤其是在使用ObjectMultiCheckBox时? 我找到了这个教程 - https://github.com/doctrine/DoctrineModule/blob/master/docs/hydrator.md,但它没有解释如何做多对多的关系。

2 个答案:

答案 0 :(得分:0)

K所以我想出了在实现保湿器之后最终怎么回事并没有约束关联,我不得不创建链接。我将把一篇完整的博客文章解释一下,但万一你仍然被卡住了。如果你想把所有的代码放在一起,我已经在github (link)了解你,我正在积极地学习/开发/清理它,所以它有点凌乱

基本上,您需要收集选定的模型,通过将关联链接添加到实体来创建关联链接,然后在Doctrine上持有cascade add / del active的实体(或者通过在实体之前保留链接来手动执行)。

以下示例是我的帖子和类别之间的多对多

您需要在实体的属性

上激活级联
/**
 * @ORM\OneToMany(targetEntity="CategoryPostAssociation", mappedBy="category",  cascade={"persist", "remove"})
 */
protected $category_post_associations;

您需要将对象管理器从表单推送到字段集

<强> PostFieldSet

$categoryFieldset = new CategoryFieldset($objectManager);
    $this->add(array(
        'type'    => 'DoctrineModule\Form\Element\ObjectMultiCheckbox',
        'name' => 'categories',
        'options' => array(
            'label' => 'Select Categories',
            'object_manager' => $objectManager,
            'should_create_template' => true,
            'target_class'   => 'OmniBlog\Entity\Category',
            'property'       => 'title',
            'target_element' => $categoryFieldset,
          ),
    ));

和categoryfieldset只有一个标题文本框。

在我的 PostController 的AddAction

public function addAction() {
    // Get your ObjectManager
    $objectManager = $this->getEntityManager();

    //Create the form and inject the ObjectManager
    //Bind the entity to the form
    $form = new PostForm($objectManager);
    $post = new Post();
    $form->bind($post);

    $request = $this->getRequest();
    if ($request->isPost()) {
        $form->setData($request->getPost());

        if ($form->isValid()) {
            /*
            * Get IDs from form element
            * Get categories from the IDs
            * add entities to $post's categories list
            */
            $element = $form->getBaseFieldset()->get('categories'); //Object of: DoctrineModule\\Form\\Element\\ObjectMultiCheckbox
            $values = $element->getValue();

            foreach($values as $catID){
                $results = $objectManager->getRepository('OmniBlog\Entity\Category')->findBy(array('id' => $catID));
                $catEntity = array_pop($results);                   
                $link = $post->addCategory($catEntity);
                //Entity/Post 's association table cascades persists and removes so don't need to persist($link), but would be done here
            }

            $objectManager->persist($post);
            $objectManager->flush();

            return $this->redirect()->toRoute(
                static::ROUTE_CHILD,
                array('controller' => static::CONTROLLER_NAME
            ));
        }
    }
    return array('form' => $form);
}

如果你看到$ post-&gt; addCategory($ catEntity);这导致我的实体或模型管理链接(我传回链接包,我想手动处理级联)

发表

    /**
 * Returns the created $link
 */
public function addCategory(Category $category){
    $link = new CategoryPostAssociation();
    $link->setCategory($category);
    $link->setPost($this);
    $this->addCategoryPostAssociations($link);
    return $link;
}

答案 1 :(得分:-1)

找到一个好的博客,逐步解释需要做什么 - http://laundry.unixslayer.pl/2013/zf2-quest-zendform-many-to-many/