Symfony-如何从实体中删除数组中的特定元素

时间:2019-03-25 14:40:55

标签: php symfony doctrine entity

我有一个Packages实体(manyToMany和EntityTypeUser在数据库中为我创建了package_des_users实体)。因此,“我的包裹”实体包含一个TypeUser数组(因为可以将包裹分配给几种类型的用户)。

我希望能够删除属于我的一个包的TypeUser数组的一部分元素。

我的行动计划是:

  1. 检索要处理的包
  2. 检索要从包的TypeUser数组中删除的TypeUser的名称。
  3. 进行检查:如果程序包仅包含一个typeUser,则直接删除该程序包。如果它包含多个,则只需删除所选的TypeUser。

现在,我能够恢复要处理的软件包以及要删除的TypeUser的名称以及包含我的软件包的TypeUser的数量。如果只包含一个,它将很好地抑制它。对于其他情况,问题仍然存在。

作为Symfony 3.4的初学者,我很难理解如何正确地做它。

我的controller.php函数:

    /**
     * Deletes a paquet entity.
     *
     * @Route("/{id}/{type}/delete", name="paquets_delete")
     */
    public function deleteAction(Request $request, $id, $type)
    {
        $em = $this->getDoctrine()->getManager();
        $unPaquet = $em->getRepository('PagesBundle:Paquet')->find($id);

        $nbTypes = count($unPaquet->getTypeUser());

        if($nbTypes == 1)
        {
            $em->remove($unPaquet);
        }

        else
        {
            $am = $this->getDoctrine()->getManager();
            $leType = $am->getRepository('PagesBundle:TypeUser') 
->findByTypeUtilisateur($type);
            $em->$unPaquet->deleteTypeFromTypesUser($leType);
        }

        $em->flush();

        return $this->redirectToRoute('paquets_index');

我的实体(拼音)功能:


    /**  
     * @var \Doctrine\Common\Collections\Collection
     * @ORM\ManyToMany(targetEntity="TypeUser")  
     * @ORM\JoinTable(name="Packages_des_TypesUser") 
     * @ORM\JoinColumn(nullable=false)
     */  
    private $typeUser;

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

    /** 
     * Get TypeUser 
     * 
     * @return Site\PagesBundle\Entity\TypeUser 
     */ 
    public function getTypeUser() 
    { 
        return $this->typeUser; 
    }

    public function deleteTypeFromTypesUser(TypeUser $type)
    {
        $this->typeUser->removeElement($type);
    }

因此,我希望能够从控制器中检索相应的TypeUser对象(结果是唯一的),以便可以将其作为参数传递给函数,该函数将负责将其从我的TypeUser数组中删除。包。然后将其转换为数据库。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

您必须在类上进行更改,正在调用实体管理器的$ unPaquet属性,然后调用一个不存在的函数。另外,您忘了检查是否有多个,否则您将从空数组中删除。

    /**
     * Deletes a paquet entity.
     *
     * @Route("/{id}/{type}/delete", name="paquets_delete")
     */
    public function deleteAction(Request $request, $id, $type)
    {
        $em = $this->getDoctrine()->getManager();
        $unPaquet = $em->getRepository('PagesBundle:Paquet')->find($id);

        $nbTypes = count($unPaquet->getTypeUser());

        if($nbTypes == 1)
        {
            $em->remove($unPaquet);
        }

        else if ( $nbTypes > 1 )
        {
            $leType = $em->getRepository('PagesBundle:TypeUser') 
->findByTypeUtilisateur($type);
            $unPaquet->deleteTypeFromTypesUser($leType);
        }

        $em->flush();

        return $this->redirectToRoute('paquets_index');
    }

“可捕获的致命错误:传递给Site \ PagesBundle \ Entity \ Paquet :: deleteTypeFromTypesUser()的参数1必须是Site \ PagesBundle \ Entity \ TypeUser的实例,给定数组”错误是由于查找返回数组。您必须更改该方法。如果您在那边需要帮助,请显示代码。

答案 1 :(得分:0)

我已经更新了代码:

    /**
 * Deletes a paquet entity.
 *
 * @Route("/{id}/{type}/delete", name="paquets_delete")
 */
public function deleteAction(Request $request, $id, $type)
{
    $em = $this->getDoctrine()->getManager();
    $unPaquet = $em->getRepository('PagesBundle:Paquet')->find($id);

    $nbTypes = count($unPaquet->getTypeUser());

    if($nbTypes == 1)
    {
        $em->remove($unPaquet);
    }

    else if($nbTypes > 1)
    {
        $am = $this->getDoctrine()->getManager();
        $leType = $am->getRepository('PagesBundle:TypeUser')- 
     >findByTypeUtilisateur($type);
        $unPaquet->deleteTypeFromTypesUser($leType[0]);
    }

    $em->flush();

现在可以了!谢谢