[英]Doctrine many-to-many join table not populating
我有以下原則.ORM.XML
文件。 我已經更新了架構,可以看到數據庫中的所有表和聯接表,並且可以實例化適用於Product和Order的實體。
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()
到數據庫時,它僅在Product / Order表中單獨創建,並且不像我期望的那樣在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(),
));
}
}
編輯:
按照Cerad的建議,我在下面添加了addProduct()
函數的地方添加了用於Order實體定義的代碼。 我還向我的產品實體代碼中添加了相應的addOrder()
方法:
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);
}
#....
}
但是,當我嘗試更新學說實體時,出現錯誤:
編譯錯誤:無法重新聲明AppBundle \\ Entity \\ Order :: addProduct
我猜您的Order :: addProduct看起來像這樣:
class Order {
addProduct($product) {
$this->products[] = $product;
如果是這樣,那么您就不會告訴產品新訂單了。 您需要添加
$product->addOrder($order);
這將完成您的雙向引用,並應允許持久性按預期工作。 如果您已經有了上面的代碼,那么還有其他問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.