fmstoun fmstoun - 4 months ago 42
SQL Question

Doctrine persist & flush causes duplicate records in Symfony

When I call persist & flush on

PersonalDevelopmentRequest
entity it causes presence of duplicate record in DB.

I use PHP 7.0.7, MySQL 5.6.28 and Symfony 2.8.7.

UPDATE: When I remove redirect at the end of controller, Doctrine persists record only once. Can redirect relates with Doctrine?

Code in controller:

$request = new PersonalDevelopmentRequest();
$request
->setTrainingGroup($training->getTrainingGroup())
->setTraining($training)
->setEmployee($this->getUser())
->setName($training->getName());

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

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

$this->addFlash('success', 'Mám to.');

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


Entity:

/**
* PersonalDevelopmentRequest.
*
* @ORM\Table(name="personal_development_request")
* @ORM\Entity(repositoryClass="AppBundle\Repository\PersonalDevelopmentRequestRepository")
* @Gedmo\SoftDeleteable()
*/
class PersonalDevelopmentRequest implements WorkflowInterface
{
use BlameableEntity;
use SoftDeleteableEntity;
use TimestampableEntity;

/**
* @ORM\Column(name="id", type="guid")
* @ORM\Id
* @ORM\GeneratedValue(strategy="UUID")
*/
private $id;

/**
* @ORM\Column(type="date", nullable=true)
*/
private $period;

/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", inversedBy="personalDevelopmentRequests")
*/
private $employee;

/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\User")
* @ORM\JoinColumn(nullable=true)
*/
private $employeeForRelation;

/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\TrainingGroup", inversedBy="requests")
* @ORM\JoinColumn(nullable=false)
*/
private $trainingGroup;

/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Training", inversedBy="requests")
* @ORM\JoinColumn(nullable=true)
*/
private $training;

/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\AnnualReview", inversedBy="requests")
*/
private $annualReview;

/**
* @ORM\Column(type="string", nullable=true)
*/
private $name;

/**
* @ORM\Column(type="text", nullable=true)
*/
private $description;

const TYPE_ANNUAL_REVIEW = 'annual_review';
const TYPE_MANUAL = 'manual';
const TYPE_TRAINING_PLAN = 'training_plan';

/**
* @ORM\Column(type="string", length=16)
*/
private $type;

const STATE_SENT = 'sent';
const STATE_DECLINED = 'declined';
const STATE_APPROVED = 'approved';
const STATE_FINISHED = 'finished';
const STATE_UNFINISHED = 'unfinished';

/**
* @ORM\Column(type="string", length=16)
*/
private $state;

const RESULT_DIDNT_COMPLETE = 0;
const RESULT_COMPLETED_PASSED = 1;
const RESULT_COMPLETED_FAILED = 2;

/**
* @ORM\Column(type="integer", nullable=true)
*/
private $result;

/**
* @ORM\Column(type="float", nullable=true)
*/
private $cost;

/**
* @ORM\Column(type="date", nullable=true)
*/
private $mustBeRenewedAfter;

const TRAINING_TYPE_NONE = null;
const TRAINING_TYPE_INT = 'int';
const TRAINING_TYPE_EXT = 'ext';

/**
* @ORM\Column(type="string", nullable=true)
*/
private $trainingType;

/**
* @ORM\Column(type="integer", nullable=true)
*/
private $rangeInHours;

/**
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Log")
* @ORM\JoinTable(name="personal_development_request_logs",
* joinColumns={@ORM\JoinColumn(name="personal_development_request_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="log_id", referencedColumnName="id", unique=true)}
* )
*/
private $logs;

...


Can anybody tell me what I am doing wrong?

Answer

I was caused because of duplicating $kernel->handle($request); in app.php.