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