Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony原则多对多插入_Php_Entity Framework_Symfony_Doctrine Orm_Doctrine - Fatal编程技术网

Php Symfony原则多对多插入

Php Symfony原则多对多插入,php,entity-framework,symfony,doctrine-orm,doctrine,Php,Entity Framework,Symfony,Doctrine Orm,Doctrine,我在Symfony中的实体和控制器有问题。我会在生成的多对多表中插入DB值 仅包含多对多元素的实体请求 class Requests { /** * @ORM\ManyToMany(targetEntity="Tipi", inversedBy="requests") * @ORM\JoinTable(name="tipi_richieste") */ private $tipi; public function __construct() { $this->ti

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

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

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;
}
}
 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;
}
 }
仅包含多对多元素的实体Tipi

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;
}
}
 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;
}
 }
insert的表单类型是EntityType

->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(),
    ));
}
当我为返回
$form[“tipi”]->getData()的值设置die时,我得到一个数组集合:

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()
fuction将singletipi添加到其内部集合中。因此,您不能在调用中添加整个
ArrayCollection

你有两个选择

为每个人做一个
foreach

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

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

    return $this;
}
创建类似于
请求的多字母::addCollections(ArrayCollection[])

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

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

    return $this;
}
无论如何,你的代码中有很多东西需要修正。这里的一个帖子太多了

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

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

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

请求::addTipi()
函数将singletipi添加到其内部集合。因此,您不能在调用中添加整个
ArrayCollection

你有两个选择

为每个人做一个
foreach

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

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

    return $this;
}
创建类似于
请求的多字母::addCollections(ArrayCollection[])

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

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

    return $this;
}
无论如何,你的代码中有很多东西需要修正。这里的一个帖子太多了

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

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


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

我个人发现
EntityType
最适合一对多和多对多-您已经尝试过了吗?@kingkero是,它很好用。我个人发现
EntityType
最适合一对多和多对多-你已经试过了吗?@kingkero是的,它很好用。嗨,对不起。我用collectiontype实现它,现在我收到关联字段“AppBundle\Entity\Requests#$tipi”的类型为“条令\Common\Collections\Collection |数组”的错误预期值,改为“数组”。。。嗨,对不起。我用collectiontype实现它,现在我收到关联字段“AppBundle\Entity\Requests#$tipi”的类型为“条令\Common\Collections\Collection |数组”的错误预期值,改为“数组”。。。