2014-11-28 5 views
0

Я могу добавить запись в many to many таблицу tag_post успешно, но я не могу удалить записи из tag_post. Пожалуйста, имейте в виду, что я хочу только удалить записи из tag_post не из таблицы post сам.Удаление записи из многих во многие таблицы doctrine symfony 2

У меня есть 3 стола post, tag и tag_post. таблицы tag_post содержит соотношение между post и tag. поля в таблице tag_post являются:

  • tag_id
  • POST_ID

Mapping файл после:

oneToMany: 
    tagPostAssociations: 
     targetEntity: Mockizart\Bundle\BlogBundle\Entity\MockblogTagPost 
     mappedBy: "post" 
     cascade: ["persist","remove"] 

Mapping файл для тега:

oneToMany: 
    tagPostAssociations: 
     targetEntity: Mockizart\Bundle\BlogBundle\Entity\MockblogTagPost 
     mappedBy: "tag" 
     cascade: ["persist","remove"] 

Отображение файлов для tag_post:

manyToOne: 
    post: 
     associationKey: true 
     targetEntity: Mockizart\Bundle\BlogBundle\Entity\MockblogPost 
     inversedBy: "tagPostAssociations" 
    tag: 
     targetEntity: Mockizart\Bundle\BlogBundle\Entity\MockblogTag 
     inversedBy: "tagPostAssociations" 

Мой код для теста:

$post = $this->getDoctrine()->getManager()->find('MockizartBlogBundle:MockblogPost',6); 
    $b = $this->getDoctrine()->getManager()->find('MockizartBlogBundle:MockblogTagPost',['tagId' => 20,'postId' => 6]); 
    $post->removeTagPostAssociation($b); 
    $this->getDoctrine()->getManager()->persist($post); 
    $this->getDoctrine()->getManager()->flush(); 

Мой tag_post объект:

public function __construct($tag, $post) 
{ 
    $this->tagId = $tag->getId(); 
    $this->postId = $post->getId(); 
    $this->post = $post; 
    $this->tag = $tag; 
} 

Мой пост лицо:

public $tagPostAssociations; 

public function __construct() { 
    $this->tagPostAssociations = new ArrayCollection(); 
} 

public function addTagPostAssociation(MockblogTagPost $tagPostAssociations) 
{ 
    $newTag = $tagPostAssociations; 
    $this->newTags[$newTag->getTagId().$newTag->getPostId()] = $newTag; 
    $hasTagPost = $this->hasTagPost($newTag); 

    if (!$hasTagPost) { 
     $this->tagPostAssociations[] = $tagPostAssociations; 
    } 

    return $this; 
} 


public function removeTagPostAssociation(MockblogTagPost $tagPost) 
{ 
    $this->tagPostAssociations->removeElement($tagPost); 


    return $this; 
} 

public function getTagPostAssociations() 
{ 
    return $this->tagPostAssociations; 
} 

я только почтовые коды, которые я думаю, по данному делу. если вы хотите увидеть больше кода, пожалуйста, дайте мне знать.

ответ

0

Я не могу проверить вашу настройку, однако я считаю, что вы смешали свое понимание атрибута cascade с помощью Doctrine. Смотрите, если вы сделали что-то вроде:

$post = $this->getDoctrine()->getManager()->find('MockizartBlogBundle:MockblogPost',6); 
$this->getDoctrine()->getManager()->remove($post); 
$this->getDoctrine()->getManager()->flush(); 

Тогда доктрина признает, что вы удаляете $post в вопросе и будут каскад операции всех ассоциаций, преследующих «удалить» правило каскада определяется, что бы удалить tag_post запись в вопросе. Однако вы не удаления $post, поэтому вы должны вручную удалить tag_post после извлечения его из вашего объекта:

$post = $this->getDoctrine()->getManager()->find('MockizartBlogBundle:MockblogPost',6); 
$b = $this->getDoctrine()->getManager()->find('MockizartBlogBundle:MockblogTagPost',['tagId' => 20,'postId' => 6]); 
$post->removeTagPostAssociation($b); 
// This may need to come after the persist, haven't tested 
$this->getDoctrine()->getManager()->remove($b); 
$this->getDoctrine()->getManager()->persist($post); 
$this->getDoctrine()->getManager()->flush(); 

Это, очевидно, громоздкое, если вы постоянно удаляя записи, так что возможно, event listener мог автоматизировать этот процесс для вас.

Еще одна вещь, чтобы отметить, что вы можете быть в состоянии уйти только с удалением tag_post и не прикасаться к post или tag объектов на всех:

$b = $this->getDoctrine()->getManager()->find('MockizartBlogBundle:MockblogTagPost',['tagId' => 20,'postId' => 6]); 
$this->getDoctrine()->getManager()->remove($b); 
$this->getDoctrine()->getManager()->flush(); 

Причина в том, что все иностранные ссылки столбцы «живут» в таблице tag_post, то есть не было бы нарушений целостности, просто удалив ссылку ManyToMany. Только дело в любой загрузке post или tag объекта будет иметь устарелый tagPostAssociations

+0

Спасибо за ответ, но я прочитал эту ссылку (ответила на @ethan) [ссылка] (http://stackoverflow.com/questions/9653493/delete-in-many-to-many-table), но ему не нужно вызывать remove() – Kakashi

+0

@MuhammadRifkiMockie. В этом вопросе вы используете истинную ассоциацию «ManyToMany», где вы решили абстрагировать 'ManyToMany' с двумя' ManyToOne' для одного объекта, чтобы вы могли добавлять атрибуты в ассоциацию. Доктрина не обрабатывает последнее изначально. – sjagr

+0

Я тестировал то, что вы сказали выше, и это работает. но я до сих пор не понимаю, почему я могу добавить в 'tagPostAssociations' без' persist() 'отдельно, но не удалять их без' remove() '. есть ли у вас какие-либо ссылки об этом? – Kakashi

Смежные вопросы