Sylius资源和原则过滤器

问题描述 投票:0回答:2

我是Sylius的新手,并试图将其扩展到我的业务中。我目前在管理部分遇到一个我不知道如何解决的问题。

我有一个与Sylius产品实体一对一关联的购物篮实体:

/**
 * @ORM\Entity
 * @ORM\Table(name="app_basket")
 */
class Basket implements ResourceInterface, BasketInterface
{
    /**
     * @ORM\OneToOne(targetEntity="App\Entity\Product\Product", inversedBy="basket", cascade={"persist", "remove"})
     * @ORM\JoinColumn(nullable=false)
     */
    private $product;
}

我创建此关系是为了能够更轻松地处理Sylius的订单管理。我不想在我的业务中混合购物篮和产品对象,所以我创建了一个过滤器来从产品中排除购物篮项目:

<?php

namespace App\Doctrine\Filter;

use App\Entity\Product\Product;
use Doctrine\ORM\Mapping\ClassMetadata;
use \Doctrine\ORM\Query\Filter\SQLFilter;

class ProductFilter extends SQLFilter
{

    /**
     * @inheritDoc
     */
    public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
    {
        if($targetEntity->getName() !== Product::class) {
            return '';
        }

        return "$targetTableAlias.id not in (select product_id from app_basket)";
    }

}

在管理产品页面上,一切都很好,我没有购物篮。但是,如果我进入购物篮管理索引页面,则会出现以下错误:

呈现模板时抛出了异常 (“ ID为id(4)的类型为'App \ Entity \ Product \ Product'的实体类型不是 找到”)。

这是由于我使用的网格。我想显示购物篮中包含的产品名称:

sylius_grid:
    grids:
        app_admin_basket:
            driver:
                name: doctrine/orm
                options:
                    class: App\Entity\Basket\Basket
            fields:
                id:
                    type: string
                    label: sylius.ui.id
                product.name:
                    type: string
                    label: sylius.ui.name

要检索basket.product.name,生成的查询将直接查询产品表,而不是查询购物篮一:

SELECT t0.code AS code_1, t0.created_at AS created_at_2, t0.updated_at AS updated_at_3, t0.enabled AS enabled_4, t0.id AS id_5, t0.variant_selection_method AS variant_selection_method_6, t0.average_rating AS average_rating_7, t0.main_taxon_id AS main_taxon_id_8, t9.id AS id_10, t9.product_id AS product_id_11 
--problem here
FROM sylius_product t0 
LEFT JOIN app_basket t9 ON t9.product_id = t0.id 
WHERE t0.id = 4 
--Doctrine SQL FIlter
AND ((t0.id not in (select product_id from app_basket)));

如果在树枝模板中得到这个,我也有相同的行为:

{{ basket.product.name }}

带有fetch =“ EAGER”注释,我没有错误,但是目标实体仍然无法反映我想要的东西。

是否有一种方法可以强制Sylius Resource首先通过购物篮实体,而不是直接传递到嵌入式实体?

symfony doctrine-orm doctrine sylius sylius-resource
2个回答
0
投票

尝试一下


0
投票

您的过滤器将始终防止取下篮子的产品。您可以尝试至少对此请求禁用它:https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/filters.html#disabling-enabling-filters-and-setting-parameters

© www.soinside.com 2019 - 2024. All rights reserved.