首页 > 解决方案 > 在 LexikFormFilterBundle 的会话中存储过滤器

问题描述

目前我在会话中存储过滤器,如下所示:

// Filter action
if ('filter' == $request->get('filter_action')) {
    // Bind values from the request
    $filterForm->handleRequest($request);

    if ($filterForm->isValid()) {
        // Build the query from the given form object
        $filterUpdater->addFilterConditions($filterForm, $queryBuilder);
        // Save filter to session
        $filterData = $filterForm->getData();
        $session->set(sprintf('%sControllerFilter', $this->filterName), $filterData);
        $session->set(sprintf('%sControllerFilterPage', $this->filterName), 1);
    }
} else {
    // Get filter from session
    if ($session->has(sprintf('%sControllerFilter', $this->filterName))) {
        $filterData = $session->get(sprintf('%sControllerFilter', $this->filterName));
        foreach ($filterData as $key => $filter) {
            if (\is_object($filter)) {
                $filterData[$key] = $em->merge($filter);
            }
        }
        $filterForm = $this->createFilterForm($filterData, $this->getSiteFromSession($request));
        $filterUpdater->addFilterConditions($filterForm, $queryBuilder);
    }
}

但由于EntityManager::merge()弃用,我需要更改此解决方案。任何想法如何做到这一点?解决方案是跳过使用EntityFilterType和使用ChoiceFilterType,但我不想这样做,因为EntityFilterType这是一个更舒适的解决方案。

如果我从会话中删除负责合并实体的行,则会收到错误消息:

必须管理传递给选择字段的“App\Entity\Category”类型的实体。也许您忘记将其保留在实体管理器中?

标签: symfonydoctrine-orm

解决方案


merge用于重新附加分离的实体。persist告诉 Doctrine 该实体将被保存,因此它实现了重新连接。通过这种方式,您可以实现对实体的管理,如错误消息所示。

您可以在这里阅读更多内容:https ://symfony.com/doc/current/doctrine.html#persisting-objects-to-the-database


推荐阅读