У меня есть проект сущности и использование Timestampable, и когда я создаю сущность, у меня есть datetime при создании, когда обновление у меня есть datetime при обновлении, но когда я удаляю, я удаляю сущность в базе данных, но у меня нет поля deletedAt. Я не хочу, чтобы удалить объект, который я хочу установить только для удаления, или как удалить его из Timestampable
/**
* Project
*
* @ORM\Table(name="project")
* @ORM\Entity(repositoryClass="Artel\ProfileBundle\Entity\Repository\ProjectRepository")
* @ExclusionPolicy("all")
*/
class Project
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @Type("integer")
*/
private $id;
/**
* @Gedmo\Slug(fields={"id", "level", "main_skill", "name"}, separator="-")
* @ORM\Column(name="slug", type="string", length=255, nullable=false)
* @Assert\Length(min=3, max=255)
* @Expose()
* @Type("string")
*/
protected $slug;
/**
* @var string
*
* @ORM\Column(name="description", type="text")
* @Assert\NotBlank
* @Expose()
* @Type("string")
*/
private $description;
/**
* @var datetime $created
*
* @Gedmo\Timestampable(on="create")
* @ORM\Column(type="datetime")
* @Expose()
* @Type("DateTime")
*/
private $created;
/**
* @var \DateTime
*
* @ORM\Column(name="deleted_at", type="datetime", nullable=true)
*/
protected $deletedAt;
/**
* @var \DateTime
*
* @Gedmo\Timestampable(on="update")
* @ORM\Column(name="updated_at", type="datetime")
*/
protected $updatedAt;
это мое действие
/**
* Deletes a Project entity.
*
* @Route("/{id}", name="admin_project_delete")
* @Method("DELETE")
* @ParamConverter("entity", class="ArtelProfileBundle:Project")
*/
public function deleteAction(Request $request, $entity)
{
$form = $this->createDeleteForm($entity->getId());
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->remove($entity);
$em->flush();
}
return $this->redirect($this->generateUrl('admin_all_project'));
}
private function createDeleteForm($id)
{
return $this->createFormBuilder()
->setAction($this->generateUrl('admin_project_delete', array('id' => $id)))
->setMethod('DELETE')
->add('submit', 'submit', array('label' => 'Delete'))
->getForm()
;
}
Поскольку вы уже используете Gedmo\Timestampable
, посмотрите на поведение Gedmo SoftDeleteable. Это не только исключает удаление вашего объекта, но и сохраняет временную метку удаления в поле, как вы просили.
Я решил свою задачу:
stof_doctrine_extensions:
orm:
default:
...
softdeleteable: true
doctrine:
...
orm:
filters:
softdeleteable:
class: Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter
enabled: true
и добавить к etity @Gedmo\SoftDeleteable (fieldName = "deletedAt")
/**
* Project
*
* @ORM\Table(name="project")
* @Gedmo\SoftDeleteable(fieldName="deletedAt")
* @ORM\Entity(repositoryClass="Artel\ProfileBundle\Entity\Repository\ProjectRepository")
* @ExclusionPolicy("all")
*/
class Project
{
/////
/**
* @var \DateTime $deletedAt
*
* @ORM\Column(name="deleted_at", type="datetime", nullable=true)
*/
protected $deletedAt;
}
и действия
/**
* Deletes a Project entity.
*
* @Route("/{id}", name="admin_project_delete")
* @Method("DELETE")
* @ParamConverter("entity", class="ArtelProfileBundle:Project")
*/
public function deleteAction(Request $request, $entity)
{
$form = $this->createDeleteForm($entity->getId());
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->remove($entity);
$em->flush();
}
return $this->redirect($this->generateUrl('admin_all_project'));
}
Тогда у меня есть сущность в моей базе данных и set deletedAt datetime
SoftDeletable
правильно, он должен сделать именно это для вас. Из документов «Поведение SoftDeleteable позволяет« мягко удалять »объекты, фильтруя их во время SELECT, помечая их как метку времени, но не удаляя их явно из базы данных».