我是Sylius的新手,并试图为我的业务扩展它。我目前在管理部分面临一个我不知道如何解决的问题。
我有一个与Sylius产品实体一对一相关的购物篮实体:
/**
* @ORMEntity
* @ORMTable(name="app_basket")
*/
class Basket implements ResourceInterface, BasketInterface
{
/**
* @ORMOneToOne(targetEntity="AppEntityProductProduct", inversedBy="basket", cascade={"persist", "remove"})
* @ORMJoinColumn(nullable=false)
*/
private $product;
}
我创建这种关系是为了能够更轻松地处理Sylius的订单管理。我不想在我的业务中混合使用购物车和产品对象,因此我创建了一个原则过滤器来从产品中排除购物篮项目:
<?php
namespace AppDoctrineFilter;
use AppEntityProductProduct;
use DoctrineORMMappingClassMetadata;
use DoctrineORMQueryFilterSQLFilter;
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( 的类型为'应用\实体\产品\产品'的实体不是 发现"(。
这是因为我使用的网格。我想显示购物篮中包含的产品名称:
sylius_grid:
grids:
app_admin_basket:
driver:
name: doctrine/orm
options:
class: AppEntityBasketBasket
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首先通过篮子实体,而不是直接传递到嵌入实体?
试试这个
sylius_grid:
grids:
app_admin_basket:
driver:
name: doctrine/orm
options:
class: AppEntityBasketBasket
fields:
id:
type: string
label: sylius.ui.id
product.name:
type: twig
label: sylius.ui.name
path: .
options:
template: thetemplate.html.twig
path: .
属性允许您访问整个实体而不是特定属性。然后,您应该能够使用 twig 模板中的data.product.name
访问它。
你也可以试试这个,虽然我还没有测试过:
sylius_grid:
grids:
app_admin_basket:
driver:
name: doctrine/orm
options:
class: AppEntityBasketBasket
fields:
id:
type: string
label: sylius.ui.id
product.name:
type: string
label: sylius.ui.name
path: product.name
您的过滤器将始终阻止获取购物篮的产品。 您可以尝试至少为此请求禁用它:https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/filters.html#disabling-enabling-filters-and-setting-parameters