Doctrine orm 条令结果集合中的过滤方法?

Doctrine orm 条令结果集合中的过滤方法?,doctrine-orm,Doctrine Orm,我对教义非常陌生,所以对于那些更有经验的人来说,这似乎是一个相当明显的问题 我正在编写一个数据导入工具,它必须检查导入的每一行是否包含有效数据。例如,该行引用了一个产品代码,我需要检查是否存在带有该代码的预先存在的产品对象。如果不是,则将该行标记为无效 现在我可以很容易地为每一行做这样的事情 $productCode = $this->csv->getProductNumber(); $product = $doctrine->getRepository('MyBundle:P

我对教义非常陌生,所以对于那些更有经验的人来说,这似乎是一个相当明显的问题

我正在编写一个数据导入工具,它必须检查导入的每一行是否包含有效数据。例如,该行引用了一个产品代码,我需要检查是否存在带有该代码的预先存在的产品对象。如果不是,则将该行标记为无效

现在我可以很容易地为每一行做这样的事情

$productCode = $this->csv->getProductNumber();
$product = $doctrine->getRepository('MyBundle:Product')->findOneBy(array('code' => $productCode ));
但这似乎效率极低。所以我考虑返回整个产品集合,然后在其中进行迭代

$query = $this->getEntityManager()->createQuery('SELECT p FROM MyBundle\Entity\Product p');
$products = $query->getResult();
一切都很好,但我必须写一些混乱的循环来搜索

两个问题:

1) 。我想知道我是否缺少了一些实用程序方法,如Magento Collections中的实用程序方法,在这些方法中,您可以在集合结果中进行搜索,而不会导致额外的数据库点击。例如,在Magento中,这将迭代代码属性上的集合和过滤器

$collection->getItemByColumnValue("code","FZTY444");
2) 。目前,我正在使用下面的查询,它返回一个“矩形数组”。效率更高,但可能更好

$query = $this->getEntityManager()->createQuery('SELECT p.code FROM MyBundle\Entity\Product p');
$products = $query->getResult();

有没有一种方法可以返回一维数组而不必重复结果集并将其转换为平面数组,这样我就可以在结果中使用数组?

您可以使用另一种模式$query->getResult()通常在对象中返回结果。看看$query->getScalarResult(),它应该更适合您的需要


有关的详细信息。

如果我正确理解您的问题,您希望筛选getResult()返回的实体数组。我有一个类似的问题,我想我已经找到了两种方法

方法1:数组 对
$products
变量使用该方法。是的,这相当于后台的“循环”,但我认为这是一种通常可以接受的过滤数组的方法,而不是自己编写。您需要提供回调(首选5.3中的匿名函数)。这里有一个例子

$codes = array_filter($products, function($i) {
    return $i->getCode() == '1234';
});
基本上,在函数中,如果希望将结果返回到
$codes
中,则返回true,否则返回false(不确定是否需要false,或者是否有足够的空返回值)

方法2:条令的阵列收集 在自定义存储库中或返回getResult()方法的任何位置,都可以返回ArrayCollection。这可以在条令名称空间
条令\Common\Collections\
中找到。可以找到此方法背后接口的更多文档。所以在这种情况下,你会

$query = $this->getEntityManager()->createQuery('SELECT p FROM MyBundle\Entity\Product p');
$products = new ArrayCollection($query->getResult());
然后可以对数组集合使用filter()方法。以非常类似于array_过滤器的方式使用它。但它不需要第一个参数,因为您这样调用它:
$products->filter(function($i){…})

ArrayCollection类是一个迭代器,因此您可以在
foreach
循环到您的内容中使用它,并且它实际上应该与您的产品数组没有什么不同。除非您的代码明确使用
$products[$x]
,否则它应该是即插即用的*


*注意:我还没有实际测试过这段代码或概念,但根据我所读到的一切,它似乎是合法的。如果发现我错了,我会更新我的答案。

嗨,皮埃尔$query=$this->getEntityManager()->createQuery('SELECT p.code FROM MyBundle\Entity\Product p')$products=$query->getScalarResult();这将返回一个嵌套数组,其中每个成员仅包含一个“code”键。奇怪的是,当只返回一个列时,它会创建一个嵌套数组。各种水合选项似乎都无法返回一个仅包含查询返回值的数组……您可以编写一个自定义水合器。对我来说似乎是最干净的方法。