У меня есть следующая доктрина .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
вы должны перенести объект продукта вместо заказов – Nandakumar
Предполагая, что вы правильно заполняете коллекцию продуктов, вы можете проверить, что происходит, если вы добавите директиву «каскад» во множество узлов «многие-ко-многим», http: // doctrine- orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/xml-mapping.html#defining-many-to-many-associations – SilvioQ
Спасибо @SilvioQ, я добавил в ' cascade-all> 'on Products (незадолго до ). Я не был уверен, добавить ли его в XML для ордеров тоже, похоже, это не так. Я обновил схему и сущности, но, к сожалению, таблица соединений по-прежнему пуста. Есть ли что-нибудь, что я могу обновить, чтобы помочь определить проблему? –
Bendy