繁体   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