Php Doctrine2在另一个迭代循环中创建新查询

Php Doctrine2在另一个迭代循环中创建新查询,php,mysql,symfony,doctrine-orm,Php,Mysql,Symfony,Doctrine Orm,我试图在游标迭代中获取一些结果,所以我得到了相关的元素和东西。但是,当在迭代中执行此查询时,迭代光标消失,即使有更多数据要获取,迭代也将结束 一个例子 protected $em; public function __construct() { $this->em = $this->get('doctrine')->getManager('default'); } public function getProducts() { $query = "SELECT

我试图在游标迭代中获取一些结果,所以我得到了相关的元素和东西。但是,当在迭代中执行此查询时,迭代光标消失,即使有更多数据要获取,迭代也将结束

一个例子

protected $em;
public function __construct() {
    $this->em = $this->get('doctrine')->getManager('default');
}
public function getProducts() {
    $query = "SELECT * FROM products"; // 100 Products
    $stmt = $this->select($query);

    while($result = $stmt->fetch()) {
        // This breaks the cursor so only 1 product is parsed.
        // If I remove this line, iteration ends perfectly (100 products)
        $pictures = $this->getPictures($result['id']);
    }
}
public function getPictures($product) {
    $query = "SELECT * FROM pictures WHERE product_id = :product_id";
    $stmt = $this->select($query, array('product_id' => $product));
    return $stmt->fetchAll();
}
public function select($query, array $params = array()) {
    $conn = $this->em->getConnection();
    $stmt = $conn->prepare($query);
    foreach($params as $key => $value) {
        $stmt->bindValue($key, $value);
    }
    $stmt->execute();

    return $stmt;
}

我认为如果不关闭上一个光标,就不能使用另一个光标。 如果查看ResultStatement界面:

/**
 * Closes the cursor, enabling the statement to be executed again.
 *
 * @return boolean TRUE on success or FALSE on failure.
 */
public function closeCursor();
当光标关闭时,通常stmt内存会被释放。 那么,为什么不为此编写一个查询呢?您可以使用子查询提取所有产品id。 比如:


从图片p中选择*其中p.id在从产品pr中选择pr.id `

是的,这是我的第二个选择,但我试图避免,因为我希望代码友好,我需要分离的方法,因为它们可以从任何地方调用,事实上,我正在使用fetchAll来避免光标重叠,直到我找到另一种方法。是的,这可能是另一种解决方案。无论如何,如果你把代码放在一个存储库中,让我说PictureRepository,有什么比getPicturesInProducts$product_id方法更友好的代码呢。数据库即位置数据库是一种抽象。