通过 ID 获取 Shopware 6 实体的推荐方法是啥?

Posted

技术标签:

【中文标题】通过 ID 获取 Shopware 6 实体的推荐方法是啥?【英文标题】:What is the recommended way to get a Shopware 6 entity by ID?通过 ID 获取 Shopware 6 实体的推荐方法是什么? 【发布时间】:2021-09-16 01:53:06 【问题描述】:

我有一个实体 ID,想通过存储库获取实体对象,目前我们这样做

$criteria = new Criteria();
    $criteria->addFilter(new EqualsFilter('id', $propertyId));

    $property = $this->propertyGroupOptionRepository->search(
        $criteria,
        $this->context
    )->first();

    if($property) 
        return $property->get('groupId');
    

有没有更好的方法,比如 Laravel 的 find 方法?

【问题讨论】:

【参考方案1】:

正如您在自己的回答中已经提到的,您可以将 ID 作为参数传递给 Criteria 对象。

我建议$property = $this->propertyGroupOptionRepository->search(new Criteria([$propertyId]), $context)->first()

未实现 find 方法,我认为永远不会,因为您可能希望加载使用某些关联和/或聚合。

【讨论】:

【参考方案2】:

至少可以使用 ID 过滤器创建条件而不创建 Equals 过滤器。

shopware 核心是这样的:

$product = $this->productRepository->search(new Criteria([$productId]), $context)->get($productId);

所以对于上面的例子,它会是

$property = $this->propertyGroupOptionRepository
    ->search(new Criteria([$propertyId]), $context)->get($propertyId);

【讨论】:

恕我直言,使用first() 函数“更好”:$product = $this->productRepository->search(new Criteria([$productId]), $context)->first();。但是没有等效于 Laravel 的 find 函数。您必须使用存储库和标准。 是的,find() 函数中没有 buit,但您应该始终更喜欢这种将 Ids 注入 Criteria-Objects 构造函数的解决方案,因为运行时行为略有不同并且以这种方式使用标准应该比使用 EqualsFilter 更快,因为这些过滤器是如何被解析的

以上是关于通过 ID 获取 Shopware 6 实体的推荐方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Shopware 6 中为订单添加自定义字段?

Shopware 6 Admin API 的文档。啥是可能的命令?

如何在 Shopware 6 中获取公用文件夹绝对路径?

Shopware 6:在自己的自定义管理模块中获取 PHP 数据

Shopware 6:如何通过 SalesChannel 级别的 EventSubscriberInterface 检测任何类别添加/更新?

无法通过 Shopware 6 中的 XmlHttpRequest 请求 PageController