Доктрина: не вставляйте все поля, только те, которые не равны NULL

у меня есть сущность.

My\Bundle\Entity\Service:
type: entity
table: SERVICE
fields:
idService:
id: true
type: integer
unsigned: false
nullable: false
column: ID_SERVICE
generator:
strategy: IDENTITY
codeService:
type: string
length: 5
fixed: false
nullable: false
column: CODE_SERVICE
dateCreation:
type: date
nullable: false
column: DATE_CREATION
dateModification:
type: date
nullable: false
column: DATE_MODIFICATION

В моей базе данных есть триггер BEFORE INSERT, который устанавливает dateCreation и dateModification.

Я хотел бы позволить ему делать свою работу, но когда я сохраняю новую сущность, я получил это Ошибка SQL :

An exception occurred while executing 'INSERT INTO SERVICE (CODE_SERVICE, DATE_CREATION, DATE_MODIFICATION) VALUES (?, ?, ?)' with params ["test", null, null]:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'DATE_CREATION' cannot be null

Есть ли способ сделать это ?
Я знаю, что триггеры плохи, но у меня нет выбора …

Вот триггер, оно работает :

    CREATE TRIGGER `SERVICE_BI_TG` BEFORE INSERT ON `SERVICE` FOR EACH ROW BEGIN
BEGIN
SET NEW.DATE_CREATION=NOW();
SET NEW.DATE_MODIFICATION=NOW();
END

Проблема в том, что у меня есть некоторые другие поля, установленные на INSERT или UPDATE, например, некоторые внешние ключи и некоторые UPDATE для других таблиц, я упростил их для своего поста.

1

Решение

Вам не нужен триггер, определенный в базе данных для этого.

Для dateCreation вы можете инициализировать его в конструкторе вашей сущности:

public function __construct()
{
$this->dateCreation = new \DateTime('now');
}

И dateModification вам нужно, чтобы метод вызвал событие preUpdate:

use Doctrine\ORM\Mapping as ORM;

/**
*  @ORM\HasLifecycleCallbacks
*/
class myEntity{

/**
* @var \DateTime
* @ORM\Column(name="date_modification", type="datetime")
*/
private $this->dateModification;

/**
* @ORM\PreUpdate
*/
public function incremenDateModification() {
$this->dateModification = new \DateTime();
}
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]