【问题标题】:softdeleteable filter not working in Symfony with mongodbsoftdeleteable 过滤器在 Symfony 和 mongodb 中不起作用
【发布时间】:2018-09-12 17:17:19
【问题描述】:

我们正在使用 Symfony 3.4 创建 API-REST 并使用 mongodb 作为数据库

所有映射和配置都已完成,并且可以正常工作。

呜呜呜呜…… softdeleteable 过滤器不起作用,我的意思是:

  • 如果我“删除”一个文档,deletedAt 可以正常工作。
  • 然后,如果我尝试获取此集合的所有文档,甚至只是该文档,我可以做到!即使它已被删除。
  • 如果我再次删除同一个文档,它就会从数据库中完全删除。

这是我的 config.yml :

stof_doctrine_extensions:
    default_locale: '%locale%'
    mongodb:
        default:
            timestampable: true
            softdeleteable: true
            translatable: true
            loggable: true
            uploadable: true
    translation_fallback: true
    uploadable: 
        default_file_path: "%kernel.root_dir%/../web/files/"

# Doctrine Configuration
doctrine_mongodb:
    default_database: "%mongodb_default_db%"
    document_managers:
        default:
            retry_connect: 5
            retry_query: 5
            auto_mapping: true
            filters:
                softdeleteable:
                    class: Gedmo\SoftDeleteable\Filter\ODM\SoftDeleteableFilter
                    enabled: true
            mappings:
                #translatable
                gedmo_translatable:
                    type: annotation
                    alias: GedmoTranslatable
                    prefix: Gedmo\Translatable\Document
                    dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Translatable/Document"
                    is_bundle: false
                #loggable
                gedmo_loggable:
                    type: annotation
                    alias: GedmoLoggable
                    prefix: Gedmo\Loggable\Document
                    dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Loggable/Document"
                    is_bundle: false        
    proxy_namespace:      MongoDBODMProxies
    proxy_dir:            "%kernel.cache_dir%/doctrine/odm/mongodb/Proxies"
    auto_generate_proxy_classes: '%kernel.debug%' 

映射示例:

Example\ExampleBundle\Model\Example:
    collection: example
    gedmo:
        loggable: true
        translation:
            locale: locale
        soft_deleteable:
            field_name: deletedAt
            time_aware: false
    fields:
        id:
            type: object_id
            id: true
        name:
            type: string
            nullable: false
            gedmo:
                - translatable
                - versioned
        description:
            type: string
            nullable: false
            gedmo:
                - translatable
                - versioned
        createdAt:
            name: created_at
            type: date
            gedmo:
                timestampable:
                    on: create
        updatedAt:
            name: updated_at
            type: date
            gedmo:
                timestampable:
                    on: update
        deletedAt:
            name: deleted_at
            type: date
            nullable: true

还有我的模特:

class Example
{
    private $id;
    ...
    private $createdAt;
    private $updatedAt;
    private $deletedAt;

    public function getId()
    {
        return $this->id;
    }

    public function setCreatedAt($createdAt)
    {
        $this->createdAt = $createdAt;

        return $this;
    }

    public function getCreatedAt()
    {
        return $this->createdAt;
    }

    public function setUpdatedAt($updatedAt)
    {
        $this->updatedAt = $updatedAt;

        return $this;
    }

    public function getUpdatedAt()
    {
        return $this->updatedAt;
    }

    public function setDeletedAt($deletedAt)
    {
        $this->deletedAt = $deletedAt;

        return $this;
    }

    public function getDeletedAt()
    {
        return $this->deletedAt;
    }
}

例如,在控制器中,要通过 ID 获取文档,我有:

/**
 * Get a single entity.
 *
 * @ApiDoc(
 *  resource=true,
 *  description="Get a single Example.",
 *  output= {"class"=Example::class},
 *  statusCodes={
 *      200="Returned when successful",
 *      404="Returned when not found"
 *  },
 *  parameters={
 *      {"name"="id", "dataType"="integer", "required"=true, "description"="Example id"}
 *  }
 * )
 *
 * @FOS\Get("/example/{id}", requirements={"id": "([a-f\d]{24})|(\d+)"})
 * @FOS\View
 *
 * @param Example $example
 *
 * @return Response
 */
public function getExampleAction(Example $example)
{
    return array('example' => $example);
}

请问,我做错了什么?

我已经有 2 天的时间尝试不同的东西,但什么都没有:(

【问题讨论】:

  • 请粘贴您用来获取文件的代码。
  • 如何禁用过滤器来检索软删除的项目?您的服务/控制器中必须有 $em->getFilterCollection()->disable('soft-deleteable'); 之类的东西。
  • @malarzm 我编辑了我的问题,将我的控制器中使用的代码通过其 ID 获取文档然后,在邮递员中使用路由 http://{{URI}}/example/5abb5c94b3525009763e87f2,即使在数据库中我可以看到 deleted_at: 2018-04-03 14:57:01.000,我也可以获得文档
  • @LBA 我不是在尝试检索软删除的项目,而是其他项目......无论如何,我可以获得全部或当我通过它的 ID 获得时,即使已设置 deletedAt 而我没有'不想要那个...我只想要那些没有被删除的文件
  • 如果不是检索查询中的所有文档,而是检索除具有deleted_at 属性的文档之外的所有文档,该怎么办?

标签: mongodb symfony doctrine-odm soft-delete


【解决方案1】:

在文档中说: “目前,它仅适用于 ORM”

https://github.com/stof/DoctrineExtensions/blob/master/doc/softdeleteable.md

所以我认为它并不完全适用于 ODM,抱歉。 您能否完成查询以检查 deletedAt 字段?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 2014-10-14
    • 2023-01-27
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多