簡體   English   中英

教義多對多聯接表未填充

[英]Doctrine many-to-many join table not populating

我有以下原則.ORM.XML文件。 我已經更新了架構,可以看到數據庫中的所有表和聯接表,並且可以實例化適用於ProductOrder的實體。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM