Php 是否存在与PDO::FETCH_类相反的情况,或者是否将对象映射回数据库

Php 是否存在与PDO::FETCH_类相反的情况,或者是否将对象映射回数据库,php,mysql,oop,pdo,Php,Mysql,Oop,Pdo,有了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。干净利落 现在,如果我能用PD

有了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的一个非常突出的特性:析构函数

只要没有对特定对象的其他引用,或者在关闭序列期间以任何顺序调用析构函数方法

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

  • 数据库中的字段和对象属性应该相同,以简化析构函数代码并使其更具可移植性
  • 我正在使用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);
  }

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

不,我想不是。PDO不是ORM!当然不是:但是你不需要花太多的努力就能拥有它。