gpt4 book ai didi

php - 是否存在与 PDO::FETCH_CLASS 相反的对象或将对象映射回数据库中

转载 作者:行者123 更新时间:2023-11-30 00:08:26 25 4
gpt4 key购买 nike

借助 PDO,我们现在可以轻松地将字段映射到对象的属性,速度极快。这个:

class myClass
{}
$stmt = $db->prepare('SELECT foo,bar FROM table WHERE id=28');
$stmt->setFecthMode(PDO::FETCH_CLASS,'myClass');
$object = $stmt->fetch();

$object 现在是类 myClass 的对象,其属性为 foo 和 bar。整洁!

现在,如果我可以仅使用 PDO 或 php,甚至 MySQL 的内置函数将对象保存回数据库,那不是令人难以置信吗!像这样的东西:

$stmt = $db->prepare('UPDATE table SET * = ?');
$stmt->setUpdateMode(PDO::UPDATE_CLASS);
$stmt->execute($object);

到目前为止,我为每个实例定义了自定义保存类。虽然速度很快,但维护起来很麻烦,而且很容易出错。

当然,对象必须具有与其尝试更新的属性完全相同的属性,或者可能具有更少的字段,但不能更多。

它存在吗? PDO 作为完美的 ORM 所缺少的部分?!

最佳答案

所以我最终使用了 oop 的一个非常突出的功能:析构函数!

The destructor method will be called as soon as there are no other references to a particular object, or in any order during the shutdown sequence.

来自 http://php.net/manual/en/language.oop5.decon.php

这非常好,因为我想要的是在网站上的点击之间维护对象的状态。这意味着不同的事情,我不确定它们是否是好的做法,但它有点容易出错。

  • 数据库中的字段和对象属性应该相同,以简化析构函数代码并使其更可移植
  • 我正在使用 PDO 的 FETCH_CLASS 模式来构建对象(如问题中所示)

现在有趣的部分是析构函数,它可以将属性保存回数据库中的相关字段:

function __destruct()
{
$whitelist = array_flip(array('foo','bar'));
// I'm pretty sure not all my properties belong in my table
foreach (get_object_vars($this) as $key => $value)
{
if (!isset($whitelist[$key])) continue;
$fields[] = $key . '=?';
$values[] = $value;
}
$sql = 'UPDATE table SET ' . implode($fields) . 'WHERE id=?';
$values[] = $this->getId();
$stmt = $db->prepare($sql);
$stmt->execute($values);
}

就在那里!下次我从数据库构造对象时,它与上次访问时完全相同。

关于php - 是否存在与 PDO::FETCH_CLASS 相反的对象或将对象映射回数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24309227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com