有没有办法将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的情况下实例化该类。
答案 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;
}
我们有两种实例化对象的方法
$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));