Reputation: 233
I don't want to update certain columns for the table.
In the Questions table, I just want to update the question column:
question:
id
question
created_by
created_at
modified_by
modified_at
is_Active
In the above table column, I don't need to update the create_at
, created_by
, modified_by
, modified_at
, is_active columns. This is the entity I am using.
Entity:
<?php
namespace Library\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Base class for all the Entities
* This class maps id, active, created and modified columns
*
* @author
*/
/**
* @ORM\MappedSuperclass
*/
class BaseEntity {
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(name="id", type="integer")
* @var integer
*/
protected $id;
/**
* @ORM\Column(name="is_active", type="boolean")
* @var boolean
*/
protected $active;
/**
* @ORM\Column(name="created_at", type="datetime")
* @var datetime
*/
protected $createdAt;
/**
* @ORM\Column(name="created_by", type="integer", nullable=true)
* @var integer
*/
protected $createdBy;
/**
* @ORM\Column(name="modified_at", type="datetime")
* @var datetime
*/
protected $modifiedAt;
/**
* @ORM\Column(name="modified_by", type="integer")
* @var integer
*/
protected $modifiedBy;
public function getId() {
return $this->id;
}
public function getActive() {
return $this->active;
}
public function getCreatedAt() {
return $this->createdAt;
}
public function getCreatedBy() {
return $this->createdBy;
}
public function getModifiedAt() {
return $this->modifiedAt;
}
public function getModifiedBy() {
return $this->modifiedBy;
}
public function setId($id) {
$this->id = $id;
}
public function setActive($active) {
$this->active = $active;
}
public function setCreatedAt($createdAt) {
$this->createdAt = $createdAt;
}
public function setCreatedBy($createdBy) {
$this->createdBy = $createdBy;
}
public function setModifiedAt($modifiedAt) {
$this->modifiedAt = $modifiedAt;
}
public function setModifiedBy($modifiedBy) {
$this->modifiedBy = $modifiedBy;
}
}
This is my Question
Entity:
<?php
namespace Survey\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Library\Entity\BaseEntity;
use Survey\Entity\Survey;
/**
* Description of Survey Questions
*
* @author Mubarak
*/
/**
* @ORM\Entity
* @ORM\Table(name="survey_questions")
*/
class Question extends BaseEntity{
/**
* @ORM\Column(name="question", type="string")
* @var string
*/
protected $question;
/**
* @ORM\ManyToOne(targetEntity="Survey\Entity\Survey", inversedBy="questions")
* @ORM\JoinColumn(name="survey_id", referencedColumnName="id")
*/
private $surveys;
public function getQuestion() {
return $this->question;
}
public function setQuestion($question) {
$this->question = $question;
}
public function getSurveys() {
return $this->surveys;
}
// public function setSurveys(ArrayCollection $survey) {
public function setSurveys(Survey $surveys = null) {
$this->surveys = $surveys;
}
// public function __toString() {
// return __CLASS__ . ": [id: {$this->id}, name: {$this->name}]";
// }
}
Here is my update function:
public function updateQuestion($userId, $data ) {
try{
$surveyId = 1;
$survey = $this->entityManager->getRepository('Survey\Entity\Survey')->find($surveyId);
$question = new Question();
$question->setQuestion($data['question']);
$question->setSurveys($survey);
$question->setId(1);
$this->entityManager->merge($question);
$this->entityManager->flush();
} catch (Exception $ex) {
throw new Exception("Couldnt update the Question");
}
Below is my error message i am getting:
An exception occurred while executing 'UPDATE survey_questions SET is_active = ?, created_at = ?, created_by = ?, modified_at = ?, modified_by = ? WHERE id = ?' with params [null, null, null, null, null, 1]:\n\nSQLSTATE[23000]: Integrity constraint violation: 1048 Column 'created_at' cannot be null
Here is my insert Operation:
public function insertQuestion($userId, $survey, $questionArr) {
try{
$question = new Question();
$question->setQuestion($questionArr['question']);
$question->setSurveys($survey);
$question->setActive(1);
$question->setCreatedBy($userId);
$question->setCreatedAt($this->createdAt);
$question->setModifiedBy($userId);
$question->setModifiedAt($this->modifiedAt);
$this->entityManager->persist($question);
$this->entityManager->flush();
return $question;
}catch(Exception $ex){
throw new Exception("Couldnt insert the question");
}
}
Upvotes: 0
Views: 2331
Reputation: 9857
The problem is that you are creating a new entity, Question
.
When calling
EntityManager::flush()
Doctrine computes the changesets of all the currently managed entities and saves the differences to the database. In case of object properties (@Column(type=”datetime”)
or@Column(type=”object”)
) these comparisons are always made BY REFERENCE.
"By reference" is important because your new entity has null
values for all date time fields (rather than the previously set \DateTime
instances). When flush()
is called Doctrine correctly detects that these fields are changed and performs the query which fails at the database level.
The merge()
operation isn't required in Doctrine when 'editing' entities, these are used for detached instances that need to be managed again.
To solve this you should load the managed instance of the entity first; then modify the fields and flush.
$question = $entityManager->find(1);
$question->setQuestion($data['question']);
$entityManager->flush();
Upvotes: 2