2015-06-01 4 views
1

Я хочу присвоить много предметов одной категории. Я использую Symfony 2.6.7.Присвоить много предметов одной категории - Связь OneToMany

Я не являюсь владельцем. Если открыть этот URI:

/категория/2/назначить

[x] Item 1 
[x] Item 2 
(Save Button) 

У меня есть возможность выбрать множество элементов с флажками.

Это мой дб стол «Item», где я хочу подключить оба:

id | category_id 

Это OneToMany соотношение, где один = Категория и много = Items.

Как я могу назначить оба здесь?

Он уже работает, когда я редактирую один элемент и выбираю категорию для этого элемента. Теперь я нахожусь на стороне категории, и здесь я хочу выделить много элементов для этой категории. Может кто-нибудь помочь, пожалуйста? :-)

+0

Взгляните на [Тип поля коллекции] (http://symfony.com/doc/current/reference/forms/types/collection.html) –

+0

hm .. спасибо, но я не хочу делать «добавить» элементы - я хочу только назначить существующие элементы существующей категории. – tokuimo

ответ

1
public function updateAction(Request $request, $id) { 
    $em = $this->getDoctrine()->getManager(); 

    $entity = $em->getRepository('YourBundle:Category')->find($id); 

    if (!$entity) { 
     throw $this->createNotFoundException('Unable to find Category entity.'); 
    } 

    $editForm = $this->createEditForm($entity); 
    $editForm->bind($request); 

    if ($editForm->isValid()) { 
     foreach ($editForm->get('items')->getData()->getValues() as $u) 
      $u->setCategory($entity); 
     $em->flush(); 

     return $this->redirect($this->generateUrl('category_show', array('id' => $id))); 
    } 

    return $this->render('YourBundle:Category:edit.html.twig', array(
       'entity' => $entity, 
       'edit_form' => $editForm->createView(), 
    )); 
} 

См, в Symfony2 сущность со свойством с доктриной комментарием inversedBy является тот, который должен принимать меры, когда вы хотите создать новую связь между двумя таблицами. Вот почему вы можете назначить категорию элементу, но не добавлять предметы в категорию.

Вышеприведенный код является стандартным CRUD-генератором Symfony2 updateAction функция. Единственным изменением является foreach, тем самым принудительно присваивая категорию каждому элементу, который вы выбрали в форме.

Это рудиментарный, но он работает.

ПРИМЕЧАНИЕ. Я не использовал обходной путь для удаления элементов из категории, но аналогичный подход мог бы сделать это. Надеюсь, поможет.

EDIT: ДЛЯ удаляют элементы:

public function updateAction(Request $request, $id) { 
     $em = $this->getDoctrine()->getManager(); 

     $entity = $em->getRepository('YourBundle:Category')->find($id); 

     if (!$entity) { 
      throw $this->createNotFoundException('Unable to find Category entity.'); 

     } 
     //new line 
     $before = $entity->getItems()->getValues(); 

     $editForm = $this->createEditForm($entity); 
     $editForm->bind($request); 

     //new line 
     $after = $entity->getItems()->getValues(); 

     if ($editForm->isValid()) { 
      //new lines 
      $UNselected = array_diff($before, $after); 
      foreach ($UNselected as $u) { 
       $u->setCategory(null); 
      } 

      foreach ($after as $u) { 
       $u->setCategory($entity); 
      } 
      //new lines - end 

      $em->flush(); 

      return $this->redirect($this->generateUrl('category_show', array('id' => $id))); 
     } 

     return $this->render('YourBundle:Category:edit.html.twig', array(
        'entity' => $entity, 
        'edit_form' => $editForm->createView(), 
     )); 
    } 

Та же функция, просто включить новые линии.

array_diff будет возвращать элементы, которые были связаны с категорией объекта до покориться и не после того, как подать, а затем с Еогеаспом снова можно назначить нуль в каждой категории этих пунктов, т.е. : разорвать связь между ними.

Второй foreach делает то же, что и исходный ответ. Просто попробуйте это сейчас и скажите мне, если это сработает.

Опять же, рудиментарный, опять же, должен работать.

+0

ДА! большое вам спасибо за вашу помощь! – tokuimo

+0

Хмм .. Я застрял с удаляемой частью.Могу ли объяснить и удалить часть, пожалуйста? :-) – tokuimo

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