2015-10-11 4 views
0

У меня есть следующая доктрина .ORM.XML файлов. Я обновил схему и могу видеть все таблицы и объединять таблицы в базе данных, и я могу создавать экземпляры объектов просто отлично для обоих Продукт и Заказ.Doctrine many-to-many join table не заполняется

Products.orm.xml:

<entity name="Product" table="product" 
     repository-class="AppBundle\Entity\ProductRepository"> 

    <many-to-many target-entity="Order" inversed-by="Product" field="orders"> 
     <join-table name="products_orders"> 
      <join-columns> 
       <join-column name="Product_id" referenced-column-name="id"/> 
      </join-columns> 
      <inverse-join-columns> 
       <join-column name="Orders_id" referenced-column-name="id"/> 
      </inverse-join-columns> 
     </join-table> 
    </many-to-many> 
</entity> 

Orders.orm.xml:

<entity name="Order" table="order" 
     repository-class="AppBundle\Entity\OrderRepository"> 

    <many-to-many field="products" mapped-by="orders" target-entity="Product" /> 
</entity> 

Однако, когда я flush() сущность в базе данных он только создается индивидуально в Продукт/Заказ таблицы и отсутствие соответствующей записи ключа b eing, сгенерированные в products_orders, присоединяются к таблице, как я и ожидал. Ниже приведен код, который у меня есть в моих контроллерах: flush() в базе данных - мне нужно как-то развернуть это, чтобы иметь дело с products_orders соединить таблицу тоже?

namespace AppBundle\Controller; 

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Component\HttpFoundation\Request; 
use FOS\RestBundle\Controller\FOSRestController; 
use AppBundle\Entity\Product; 
use AppBundle\Entity\Order; 

class DefaultController extends FOSRestController 
{ 
    /** 
    * @Route("/neworder", name="new_order") 
    */ 
    public function newOrderAction(Request $request) 
    { 
     $order = new Order(); 
     $em = $this->getDoctrine()->getManager(); 

     $products = $em->getRepository('AppBundle:Product') 
      ->findAllOrderedByName(); 

     $form = $this->CreateFormBuilder($order) 
      ->add('products', 'entity', array(
       'class' => 'AppBundle:Product', 
       'choice_label' => 'Description', 
      )) 
      ->add('Quantity', 'integer') 
      ->add('Units', 'text') 
      ->add('Save', 'submit', array('label' => 'Create Order')) 
      ->getForm(); 


     $form->handleRequest($request); 
     if ($form->isValid()) { 
      $em->persist($order); 
      $em->flush(); 
      return $this->redirectToRoute('homepage'); 
     } 

     return $this->render('AppBundle:Default:new.order.form.html.twig', array(
      'form' => $form->createView(), 
     )); 

    } 
} 

EDIT:

После предложения Cerad, я уже добавил код для моего заказа определения сущности ниже, где я добавил функцию addProduct(). Я также добавил соответствующий addOrder() метод к моим кодам продукта Entity Too:

namespace AppBundle\Entity; 
use Doctrine\Common\Collections\ArrayCollection; 

class Order 
{ 
    protected $id; 
    public $products; 
    public function __construct() 
    { 
     $this->products = new ArrayCollection(); 
    } 


    public function addProduct($product) { 
     $product->addOrder($order); 
    } 
    #.... 
} 

Однако, когда я пытаюсь обновить доктрину сущность я получаю сообщение об ошибке:

Compile Error: Cannot redeclare AppBundle\Entity\Order::addProduct

+0

вы должны перенести объект продукта вместо заказов – Nandakumar

+0

Предполагая, что вы правильно заполняете коллекцию продуктов, вы можете проверить, что происходит, если вы добавите директиву «каскад» во множество узлов «многие-ко-многим», http: // doctrine- orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/xml-mapping.html#defining-many-to-many-associations – SilvioQ

+0

Спасибо @SilvioQ, я добавил в ' 'on Products (незадолго до ). Я не был уверен, добавить ли его в XML для ордеров тоже, похоже, это не так. Я обновил схему и сущности, но, к сожалению, таблица соединений по-прежнему пуста. Есть ли что-нибудь, что я могу обновить, чтобы помочь определить проблему? – Bendy

ответ

0

Я предполагаю, что ваш заказ :: addProduct выглядит так:

class Order { 
    addProduct($product) { 
    $this->products[] = $product; 

Если это так, вы не сообщаете продукт о новом заказе. Вам необходимо добавить

$product->addOrder($order); 

Это позволит заполнить ваши двусторонние ссылки и дать возможность работать, как ожидалось. Если у вас уже есть код выше, то что-то еще не так.

+0

Спасибо, я думаю, что вы правы - хотя я использую доктрину сгенерированных сущностей с автогенерированными геттерами/сеттерами. Метод «addProduct», который вы упомянули, мне совсем не нравится. Нужно ли мне добавить соответствующий метод addOrder для моего объекта Product? Я думал, что я забочусь об этом в '__construct'? – Bendy

+0

Опубликовать код заказа, который касается продуктов. У вас должен быть какой-то добавочный или заданный продукт. Аналогично, вашему объекту Product нужен какой-то порядок set/add. Кстати, иметь много-много отношений между продуктом и порядком немного необычно. Обычно у вас будет объект OrderLine, который позволяет устанавливать количество для данного продукта. – Cerad

+0

Я обновил свой вопрос, включив класс Order после попытки добавить функцию addProduct, которую вы упомянули, вместе с ошибкой доктрины, которую я получаю, - заранее заблаговременно – Bendy

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