PDO - FETCH_CLASS - 将结果作为参数传递给构造函数

时间:2012-09-11 10:49:54

标签: php pdo

有没有办法将PDO的结果作为构造函数的参数传递? 比方说,我有以下课程:

class Test
{
    private $value1;
    private $value2;
    function __construct($val1, $val2)
    {
        $this->value1 = $val1; $this->value2 = $val2;
    }
}

然后,通过PDO驱动程序,我从DB中选择一些数据,假设:

SELECT price, quantity FROM stock

$results = $query->fetchAll(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, "Test");

现在,PDO将这些值直接传递给类字段,并绕过构造函数。

也许我错过了什么,但我想将查询结果传递给构造函数。 构造函数不能依赖于查询,我希望能够在不使用PDO的情况下实例化该类。

6 个答案:

答案 0 :(得分:4)

我想到的唯一方法是使用FETCH_FUNC常量并提供一个函数来通过构造函数创建对象。

function rowMapper( $price, $quantity)
{
  return new Test( $price, $quantity);
}
$results = $query->fetchAll( PDO::FETCH_FUNC, "rowMapper");

现在只使用构造函数创建对象,而不是让PDO在私有数据中注入值并破坏封装。

答案 1 :(得分:2)

  

也许我错过了什么,但我想将查询结果传递给构造函数。

可以使用PDO::FETCH_CLASS

直接将查询结果分配给对象属性

如果需要,我们还需要一个能够覆盖PDO值的构造函数,因此请从PDO::FETCH_PROPS_LATE中删除fetch

function __construct($val1=null, $val2=null) {

      // now the constructor is called after the fetch
      // if you pass values to it, they will be assigned

  if ($val1!==null) $this->price = $val1; 
  if ($val2!==null) $this->quantity = $val2;
}

我们有两种实例化对象的方法

PDO

$stmt = $db->prepare('SELECT price, quantity FROM stock');
$stmt->setFetchMode(PDO::FETCH_CLASS,'Test');
$result = $stmt->fetch();

$result = new Test(25,100);

如果你想使用来自数据库的值,你可以在构造函数中这样做,仍然会离开FETCH_PROPS_LATE

function __construct($val1=null, $val2=null) {
  if ($val1!==null) $this->price = $val1;
  if ($val2!==null) $this->quantity = $val2;
  $this->formattedPrice = number_format($this->price,'2');
}

答案 2 :(得分:1)

[我编辑了这个答案,因为我以前的答案不再准确。]

FETCH_CLASS会进入私有属性。请参阅this answer

答案 3 :(得分:1)

我在为我的实体构建PDO存储库时遇到了这种情况。我没有使用这种方法,因为我不想一对一地匹配参数。通过使用静态工厂模式,这是我可以模仿构造函数的最接近的。

class User
{
    private $id;
    public $name;
    public $isMinor;

    // make sure parameters are in the same order as the mysql result
    public static function buildFromPdo($id, $age, $name)
    {
        $user = new self;
        $user->id = $id;
        $user->name = $name;
        $user->isMinor = $age < 18;
        return $user;
    }

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


$stmt = $db->prepare('SELECT id, age, name FROM users');
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_FUNC, "User::buildFromPdo");

&#34; $结果&#34;将是一个User对象数组。

答案 4 :(得分:0)

在你的情况下,你可以像这样传递它们:

$results = $query->fetchAll(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, "Test", array('val1', 'val1'));

了解fetchAll() here的第3个参数。

答案 5 :(得分:-1)

使用PdoObject :: fetchAll(\ PDO :: FETCH_CLASS),这将返回您想要的东西。

不过,如果您需要通过一些特定的操作,请遵循以下代码段

$sql = "SELECT * FROM ".$table. " WHERE id=$id";
$sth = $dbAdapter->prepare($sql);
$sth->execute();

//inject anything you want
$result = $sth->fetchAll(\PDO::FETCH_CLASS, $tableClass, array($pass1, $pass2, $dbAdapter));