PDO FETCH_INTO工厂?

时间:2010-10-01 14:14:20

标签: php pdo factory

我有一个名为ProductFactory

的工厂

我可以创建这样的产品:

$product = ProductFactory::getProduct($id);

现在,根据我们获得的产品类型,此函数可能会返回Product类或后代或Product类。

但是使用上面的方法,$product类将负责连接数据库并检索其数据。


因此,如果我要选择要在类别列表中显示的20个产品,我必须首先获得所有ID的列表,然后调用上述功能20次。这将是对数据库的21次调用。

所以我在工厂添加了另一个功能:

$product = ProductFactory::createProduct($data);

除了从数据库传入数据之外,这也是一样的,保存$product类不必进行旅行。 (根据您传递的数据,工厂将返回正确的类型)。

所以现在我想打一个电话来选择所有产品数据,FETCH_INTO我的工厂为每一行生成一个$ product对象。

我该怎么做?

更新

以下是我尝试过的不起作用:

$stmt->setFetchMode(PDO::FETCH_INTO,ProductFactory::createProduct);
foreach($stmt as $product)
{
    echo get_class($product) . '<br>';
}

2 个答案:

答案 0 :(得分:1)

可以使用PDO::FETCH_CLASSTYPE来代替

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'localonly', 'localonly');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
initDemo($pdo);

$result = $pdo->query("SELECT IF(x,'Product','ProductXVal'), id, x FROM soTest");
while ( $obj=$result->fetch(PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE) ) {
  echo get_class($obj), "\n";
}

class Product {
  public function id() { return $this->id; }
}

class ProductXVal extends Product {
  public function x() { return $this->x; }
}

function initDemo($pdo) {
  $pdo->exec('CREATE TEMPORARY TABLE soTest (id int auto_increment, x int, primary key(id))');
  $pdo->exec('INSERT INTO soTest (x) VALUES (1),(NULL),(2),(NULL),(3),(NULL)');
}

打印

Product
ProductXVal
Product
ProductXVal
Product
ProductXVal

但这似乎相当......至少可以说是奇怪的 我宁愿将数据作为数组获取,然后将其传递给创建适当对象的工厂。您可以在从PDO和/或PDOStatement派生的类中执行此操作。

答案 1 :(得分:0)

根据the comments section on the PDOStatement->fetch()页面,您应该这样做:

$stmt->setFetchMode(PDO::FETCH_INTO, new myClass());
$stmt->execute();
while ($object = $stmt->fetch())
{
  $result[] = clone $object;
}

所以存在差异

  1. 您将fetch_in传递给方法而不是现有对象
  2. 您没有执行声明(至少在您的示例中)
  3. 您没有在循环中包含对fetch()的调用
  4. 你没有克隆对象
  5. 现在我不知道它是否可以使用工厂方法而不是现有对象,但是调用execute()和fetch()是你能做的最少的事情:)