【问题标题】: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 方法?

【问题讨论】:

    标签: data-access-layer shopware


    【解决方案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 更快,因为这些过滤器是如何被解析的
      猜你喜欢
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      相关资源
      最近更新 更多