当前位置: 首页 > 知识库问答 >
问题:

多对多关系设置器

金令
2023-03-14

我的实体之间存在多对多关系:采购订单供应商。当我想在我的Symfony项目中将供应商添加到订单时,我总是收到以下错误消息:

属性“suppliers”在类“Acme\AppBundle\Entity\PurchaseOrder”中不是公共的。也许您应该创建方法“setSuppliers()”?

当我自己在PurchaseSOEntity中创建setSubplers()函数时:

public function setSuppliers(\Acme\AppBundle\Entity\Supplier $suppliers )
{
    $this->suppliers = $suppliers;

    return $this;
}

我收到以下错误消息:

可捕获的致命错误:传递给Doctrine\通用\集合\Array集合::__construct()的参数1必须是数组类型、给定对象、在第519行的 /var/www/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php中调用并在第47行的 /var/www/symfony/vendor/doctrine/collections/lib/Doctrine/Common/Collections/ArrayCollection.php中定义

有什么想法吗?

/**
 * @Route("order/{id}/supplieradd", name="order_supplieradd")
 * @Secure(roles="ROLE_ADMIN")
 */
public function newSupplierAction(Request $request, $id)
{
    $purchaseOrder = $this->getDoctrine()
    ->getRepository('AcmeAppBundle:PurchaseOrder')
    ->find($id);

    if (!$purchaseOrder) {
        throw $this->createNotFoundException(
                'No order found for id '.$id
        );
    }

    $form = $this->createForm(new AddSupplierType(), $purchaseOrder);

    // process the form on POST
    if ($request->isMethod('POST')) {
        $form->bind($request);
        if ($form->isValid()) {             

            $em = $this->getDoctrine()->getManager();

            $em->persist($purchaseOrder);
            $em->flush();

            return new Response('Added Supplier to Order with ID '.$articleOrder->getId());
        }
    }

    return $this->render('AcmeAppBundle:BasicData:newSupplier.html.twig', array(
            'form' => $form->createView(),
            'id' => $id,
    ));
}

和我的添加供应商类型.php

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('suppliers', 'entity', array(
         'class' => 'AcmeAppBundle:Supplier',
         'property' => 'name',
    ));
}

PurchaseSO供应商实体的某些部分:

 class PurchaseOrder{
  ...
         /**
         * @ORM\ManyToMany(targetEntity="Supplier", mappedBy="purchaseOrders")     
         */
    private $suppliers;

    public function __construct()
    {
        $this->suppliers = new ArrayCollection();
    }

/**
 * Add suppliers
 *
 * @param \Acme\AppBundle\Entity\Supplier $suppliers
 * @return PurchaseOrder
 */
public function addSupplier(\Acme\AppBundle\Entity\Supplier $suppliers)
{
    $this->suppliers[] = $suppliers;

    return $this;
}

/**
 * Remove suppliers
 *
 * @param \Acme\AppBundle\Entity\Supplier $suppliers
 */
public function removeSupplier(\Acme\AppBundle\Entity\Supplier $suppliers)
{
    $this->suppliers->removeElement($suppliers);
}

/**
 * Get suppliers
 *
 * @return \Doctrine\Common\Collections\Collection 
 */
public function getSuppliers()
{
    return $this->suppliers;
}
}

class Supplier{
    ...

    /**
     * @ORM\ManyToMany(targetEntity="PurchaseOrder", inversedBy="suppliers")
     * @ORM\JoinTable(name="suppliers_purchaseOrders")
     */
    private $purchaseOrders;
}

新的添加删除集方法:

 /**
     * Add supplier
     *
     * @param \Acme\AppBundle\Entity\Supplier $supplier
     * @return PurchaseOrder
     */
public function addSupplier(\Acme\AppBundle\Entity\Supplier $supplier)
{
    $this->suppliers->add($supplier);

    return $this;
}

/**
 * Remove supplier
 *
 * @param \Acme\AppBundle\Entity\Supplier $supplier
 */
public function removeSupplier(\Acme\AppBundle\Entity\Supplier $supplier)
{
    $this->suppliers->removeElement($supplier);
}

public function setSuppliers($supplier)
{
     if ( is_array($supplier) ) {
        $this->suppliers = $supplier ;
    } else {
        $this->suppliers->clear() ;
        $this->suppliers->add($supplier) ;
    }
}

共有2个答案

吴均
2023-03-14

您的setSuplers方法不应该将Array集合作为第一个参数吗?

public function setSuppliers(ArrayCollection $suppliers )
{
    $this->suppliers = $suppliers;

    return $this;
}

当你在构造函数中将其初始化为 ArrayCollection 时。使用 setSuppliers 方法,您可以将 ArrayCollection 转换为单个 Supplier 对象。

您的表单将返回一个选定的 Suplier 对象。如果这是你想要的,你为什么不使用OnyToMany实现呢?否则,您可以将多个选项添加到表单域中。然后可以将多个 Suplier 对象作为数组返回。

单于奕
2023-03-14

问题:

>

  • 语法不正确的方法名称及其参数:

    public function addSupplier(\Acme\AppBundle\Entity\Supplier $suppliers)
    

    方法说addSupplier(单数)但你接受供应商(复数)

    您需要对此方法进行重构:

    public function addSupplier(Supplier $supplier)
    {
        $this->suppliers->add($supplier) ;
    }
    

    也:

    public function removeSupplier(Supplier $supplier)
    {
        $this->suppliers->removeElement($supplier) ;
    }
    

    如果您像我的答案那样做,则 getter 和 setter 方法将起作用:在多对多关系的形式中设置 multiple='false' symfony2

    Symfony会找到add...()并移除...()方法本身。因此,如果关系是“供应商”,它会找到addSupplier。或者如果relation是“categories”,它会找到addCategory()和removeCategory()。

  •  类似资料:
    • 问题内容: 伙计们,我正在努力为我的公司制作一个简单的票证生成系统,以吸引人。目前,我的MSSQL数据库中有一个名为的表,另一个名为的表。 我的应用程序是C#Windows窗体,因此在新的票证生成窗体上,我有许多文本框和一个用于分配工程师的comboBox,由填充。生成票证后,以这种形式输入的所有信息都将与from一起存储。 效果很好,但是后来我的客户要求我添加选项,以便可以在一张票上分配3名工程

    • 问题内容: 我目前正在使用ActiveAndroid,并且在过去的几个小时里一直在尝试建立多对多关系,但是我还是无法正常工作。我希望你能帮助我: 我有“学生”和“课程”的模型,一个学生可以有很多课程,而一个课程有很多学生。基本上,这就是我在“ StudentCourse”模型中所拥有的: 现在,我要做的是使用以下代码获取“课程X中的所有学生”: 但是我收到以下错误: java.lang.Class

    • 在本章中,让我们了解和学习多对多的关系。要表示多对多关系,必须创建第三个表(通常称为联接表),将多对多关系分解为两个一对多关系。 为此,我们还需要添加一个联接表。 下面先添加一个表。表的定义如下所示 - 现在创建一个多对多的关系。假设有多个作者在多个项目上工作,反之亦然。 如您所知,我们在中有一个字段,所以为它创建了一个表。但现在不再需要这个字段了。 选择字段,然后按下删除 按钮,将看到以下消息。

    • 我还想知道如何定义每个模型上的关系--你是否需要或者是否可以只在用户上定义关系?

    • 问题内容: 我需要使用类别表过滤查询,该类别表与另一个表具有many2many关系。是否可以过滤与many2many关系的查询? 表具有与表相关的many2many字段,或者说伙伴可以具有许多类别。我需要的是过滤具有类别“业务”或“零售”的表。如果没有任何这些类别,则不应显示。 此外还有另外一个领域是,有关系有: 具有以下关系的字段: 到(many2many) 到(one2many) (字符) 具