簡體   English   中英

無法以一對多關系從數據庫中刪除記錄

[英]Unable to delete records from the database in a one-to-many relationship

在Symfony 2.8項目中,我有一個與CompanyProductionUnits具有一對多關系的PersonDetail對象:

use Doctrine\ORM\Mapping as ORM,
    Doctrine\Common\Collections\ArrayCollection;
use Gedmo\Mapping\Annotation as Gedmo;

/**
 * AppBundle\Entity\GeneralData\PersonDetail
 *
 * @ORM\Table(name="person_detail")
 * @ORM\Entity(repositoryClass="PersonDetailRepository")
 * @ORM\HasLifecycleCallbacks
 */
class PersonDetail
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var ArrayCollection $companyProductionUnits
     *
     * @ORM\OneToMany(targetEntity="PersonDetailCompanyProductionUnit", mappedBy = "personDetail", cascade={"persist", "remove"})
     */
    private $companyProductionUnits;
}


<?php
namespace AppBundle\Entity\GeneralData;

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;

/**
 * AppBundle\Entity\GeneralData\PersonDetailCompanyProductionUnit
 *
 * @ORM\Table(name="person_detail_company_production_unit")
 * @ORM\Entity()
 * @ORM\HasLifecycleCallbacks
 */
class PersonDetailCompanyProductionUnit {
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var Company $company
     *
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\GeneralData\CompanyProductionUnit")
     * @ORM\JoinColumn(name="company_production_unit_id", referencedColumnName="id")
     */
    protected $companyProductionUnit;

    /**
     * @var PersonDetail $personDetail
     *
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\GeneralData\PersonDetail", inversedBy="companyProductionUnits")
     * @ORM\JoinColumn(name="person_detail_id", referencedColumnName="id")
     */
    protected $personDetail;
}    

當用戶在表單中執行特定操作時,我想清空公司單位數組集合,將moveEmployee值設置為1.因此,當moveEmployee的值為1時,我從集合中刪除公司生產單元對象。 但是記錄不會從數據庫中刪除。 為什么?

在這里,您是表單處理程序:

<?php
namespace AppBundle\Form\Handler;

use AppBundle\Entity\GeneralData\PersonDetailCompanyProductionUnit;
use Symfony\Component\HttpFoundation\Request,
    Symfony\Component\Form\FormInterface,
    Symfony\Component\HttpFoundation\Session\Session;

use Doctrine\ORM\EntityManager;
use AppBundle\Entity\GeneralData\PersonDetail;

class CompanyProductionUnitEmployeeFormHandler {

    private $entityManager;
    private $session;

    public function __construct(
        EntityManager $entityManager,
        Session $session
    )
    {
        $this->entityManager = $entityManager;
        $this->session = $session;
    }

    public function handle(FormInterface $form, Request $request, $message)
    {
        if(!$request->isMethod('POST')) {
            return false;
        }

        $form->bind($request);

        if(!$form->isValid()) {
            return false;
        }

        $data = $request->request->get('company_production_unit_employee');

        $productionUnit = $this->entityManager
            ->getRepository('AppBundle\Entity\GeneralData\CompanyProductionUnit')
            ->find($data['productionUnit']);

        $personDetail = $this->entityManager
            ->getRepository('AppBundle\Entity\GeneralData\PersonDetail')
            ->find($data['personDetail']);

        if($data['moveEmployee'] == 1) {
            //first try
            foreach($personDetail->getCompanyProductionUnits() as $unit) {
                $this->entityManager->remove($unit);
            }

            //I tried also in the following way but without success
            //$personDetail->companyProductionUnits->clear();

        }

        $personDetailCompanyProductionUnit = new PersonDetailCompanyProductionUnit();
          $personDetailCompanyProductionUnit->setPersonDetail($personDetail);
              $personDetail->addCompanyProductionUnit($personDetailCompanyProductionUnit);

        $this->persist($personDetail, $message);

        return true;
    }

    public function persist(PersonDetail $personDetail, $message)
    {    
        $this->entityManager->persist($personDetail);
        $this->entityManager->flush();

        $this->session->getFlashBag()->add('success', $message);
    }
}

我快速瀏覽了一下,認為這可能是最有幫助的,從你的要求來看,我認為這份文件可能會幫助你解決這個問題。 與協會合作

我隨便發現我的代碼在我應用前面例子中嘗試的兩種策略時都能正常工作。 因此,解決方案是在表單處理程序中使用以下代碼:

if($data['moveEmployee'] == 1) {
    foreach($personDetail->getCompanyProductionUnits() as $unit) {
        $this->entityManager->remove($unit);
    }

    $personDetail->companyProductionUnits->clear();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM