【问题标题】:Symfony2 / Doctrine: Reading "deleted" data when using Gedmo's doctrine extensionsSymfony2 / Doctrine:使用 Gedmo 的学说扩展时读取“已删除”数据
【发布时间】:2013-10-23 18:13:55
【问题描述】:

我正在构建一个 Symfony2 项目并使用 gedmo/doctrine-extensions (GitHub) 来实现软删除。我的问题是是否有办法“禁用”或“覆盖”软删除,甚至检测是否有内容被软删除。

情况如下:

我有一个引用“用户”实体的“注释”实体。特定注释引用已被软删除的用户。即使用户已被删除,它也会为 TWIG 的“已定义”逻辑返回 true,甚至可以返回已删除用户的 id。但是,如果我查询任何其他信息(包括标记是否已被删除的“deletedAt”参数),我会收到 500“找不到实体”错误。

由于数据实际上仍然存在,并且由于笔记本身没有被删除,所以我仍然想说谁写了笔记,即使用户已被删除。

这可能吗?如果没有,我如何正确检测是否有内容被软删除?就像我说的,$note->getUser() 仍然会检索一个对象并为任何 null /“已定义”比较返回 true。

【问题讨论】:

标签: symfony doctrine soft-delete


【解决方案1】:

你可以这样做:

$filter = $em->getFilters()->enable('soft-deleteable');
$filter->disableForEntity('Entity\User');
$filter->enableForEntity('Entity\Note');

【讨论】:

  • 它可以是 'softdeleteable' 而不是 'soft-deleteable' ...(我正在使用 stof 学说扩展)
【解决方案2】:

您需要将关系加载设置为eager,这将防止仅使用id 而没有其他内容的对象延迟加载。

您可以在此处找到有关预加载及其注释的更多信息:

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-objects.html#by-eager-loading

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html.

至于我的代码,这就是现在定义指向User 的链接时的样子:

/**
 * @ORM\ManyToOne(targetEntity="User", inversedBy="answers", fetch="EAGER")
 * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
 */
private $user;

在这种情况下,User 实体可以有多个answers。从answer 角度加载User 时,这将起作用:

foreach($answers as $answer) {
    $user = $answer->getUser();

    if (!$user) {
        continue;
    }
}

【讨论】:

    【解决方案3】:

    您可以暂时禁用软删除,以便在结果中返回已删除的项目。 See the documentation,您特别感兴趣的是以下部分:

    这将禁用 SoftDeleteable 过滤器,因此实体 “软删除”将出现在结果中 $em->getFilters()->disable('软删除');

    所以,首先在您的实体管理器$em 上运行上面的代码,然后使用它来收集您的$note

    【讨论】:

    • 问题是我不想要被软删除的父实体(即笔记)。禁用过滤器也会返回我不想要的已删除笔记。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 2015-03-17
    • 2012-08-03
    相关资源
    最近更新 更多