我是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首先通过购物篮实体,而不是直接传递到嵌入式实体?
尝试一下