代码之家  ›  专栏  ›  技术社区  ›  JD Isaacks

PDO把你送到工厂?

  •  0
  • JD Isaacks  · 技术社区  · 15 年前

    我有一个工厂叫 ProductFactory

    我可以创造这样一个产品:

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

    Product 或后代或 产品 .

    但使用上述方法 $product


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

    所以我在我的工厂里增加了另一个功能:

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

    这做同样的事情,除了从数据库传入数据,保存 别让同学们不得不去旅行。(根据传递的数据,工厂将返回正确类型的类)。

    所以现在我想打一个电话来选择所有产品和数据 FETCH_INTO

    我该怎么做?

    $stmt->setFetchMode(PDO::FETCH_INTO,ProductFactory::createProduct);
    foreach($stmt as $product)
    {
        echo get_class($product) . '<br>';
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   VolkerK    15 年前

    能够 使用 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
    


        2
  •  0
  •   Michael Clerx    15 年前

    根据 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\u传递到方法中,而不是现有对象中
    2. 您没有执行语句(至少在您的示例中)
    3. 循环中没有包含对fetch()的调用

    现在我不知道它是否能用工厂方法而不是现有对象工作,但是调用execute()和fetch()是您至少能做的:)

    推荐文章