Symfony学说多对多插入


Symfony Doctrine Many to Many insert

我在Symfony中的实体和控制器有问题。我会在我的数据库值上插入生成的多对多表中。

仅包含多对多元素的实体请求

class Requests {
  /**
 * @ORM'ManyToMany(targetEntity="Tipi", inversedBy="requests")
 * @ORM'JoinTable(name="tipi_richieste")
 */
 private $tipi;

 public function __construct() {
    $this->tipi = new 'Doctrine'Common'Collections'ArrayCollection();
 }

 /**
 * Add tipi
 *
 * @param 'AppBundle'Entity'Tipi $tipi
 *
 * @return Requests
 */
public function addTipi('AppBundle'Entity'Tipi $tipi) {
    $this->tipi[] = $tipi;
    return $this;
}
/**
 * Remove tipi
 *
 * @param 'AppBundle'Entity'Tipi $tipi
 */
public function removeTipi('AppBundle'Entity'Tipi $tipi) {
    $this->tipi->removeElement($tipi);
}
/**
 * Get tipi
 *
 * @return 'Doctrine'Common'Collections'Collection
 */
public function getTipi() {
    return $this->tipi;
}
}

仅具有多对多元素的实体 Tipi

 class Tipi {
 /**
 * @ORM'ManyToMany(targetEntity="Requests", mappedBy="tipi")
 */
 private $requests;

  /**
 * Constructor
 */
public function __construct() {
    $this->requests = new 'Doctrine'Common'Collections'ArrayCollection();
 }
      /**
 * Add request
 *
 * @param 'AppBundle'Entity'Requests $request
 *
 * @return Tipi
 */
public function addRequest('AppBundle'Entity'Requests $request)
{
    $this->requests[] = $request;
    return $this;
}
/**
 * Remove request
 *
 * @param 'AppBundle'Entity'Requests $request
 */
public function removeRequest('AppBundle'Entity'Requests $request)
{
    $this->requests->removeElement($request);
}
/**
 * Get requests
 *
 * @return 'Doctrine'Common'Collections'Collection
 */
public function getRequests()
{
    return $this->requests;
}
 }

插入的窗体类型是实体类型

->add('tipi', EntityType::class, array(
                'label' => 'Tipo',
                'class' => 'AppBundle:Tipi',
                'mapped' => false,
                'attr' => array('class' => 'form-control'),
                'multiple'    => true,
                'by_reference' => false,
                'query_builder' => function (EntityRepository $er) {
            return $er->createQueryBuilder('t');
        },
            ))

在我的控制器中,我以这种方式工作:

public function indexAction(Request $request) {
    $requests = new Requests();
    $em = $this->getDoctrine()->getManager();
    $form = $this->createForm(RequestsType::class, $requests);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $requests->setCreateAt(new 'DateTime('now'));
          $request_tipi = $form["tipi"]->getData();
          $tipi_array = [];
           die($form["tipi"]->getData());
          $tipi_array = $em->getRepository('AppBundle:Tipi')->findOneBy(array('codice' => $form["tipi"]->getData()));
        $tipi = new Tipi();
        $requests->addTipi($form["tipi"]->getData());
        $em->persist($requests);
        $em->flush();
        //return $this->redirectToRoute('immovable_edit', array('id' => $immovables->getId()));
    }
    return $this->render('AppBundle:Requests:index.html.twig', array(
                'requests' => $requests,
                'form' => $form->createView(),
    ));
}

当我把 die 用于返回值时$form["tipi"]->getData()我得到一个数组集合:

Doctrine'Common'Collections'ArrayCollection@000000005b52ae6b00000000731dd0b4

但是我收到此错误

可捕获的致命错误:传递给 AppBundle''Entity''Requests::addTipi() 的参数 1 必须是 AppBundle''Entity''Tipi 的实例,给定的 Doctrine''Common''Collections''ArrayCollection 的实例,在第 31 行调用 C:''xampp''htdocs''bugaro''src''AppBundle''Controller''RequestsController.php 并定义

Request::addTipi()功能将

单个 tipi 添加到其内部集合中。因此,您无法在调用中添加整个ArrayCollection

您有两种选择。

做一个foreach

foreach($form["tipi"]->getData() as $tipi) {
    $requests->addTipi($tipi);
}

创建像Requests::addCollections(ArrayCollection[])一样的多设置器

public function addTipis($tipis) {
    foreach($tipis as $tipi) {
        $this->tipi[] = $tipi;
    }
    return $this;
}

无论如何,您的代码中有很多需要修复的内容。对于这里的单个帖子来说太多了。

但这些修复中最重要的是您不需要大多数控制器代码。 ;-)

由于您将对象传递到表单中$requests因此它已经双向绑定,这意味着Symfony的表单组件应该自动用新值填充其属性。这包括许多关系的收藏。

此外,如果您不传递该对象,$form->getData()应该返回一个新的Resnponses实例,因此您无需创建它并手动传递它,直到它是现有实例的版本。