我有一个名为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>';
}
答案 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;
}
所以存在差异
现在我不知道它是否可以使用工厂方法而不是现有对象,但是调用execute()和fetch()是你能做的最少的事情:)