【问题标题】:Does the contrary of PDO::FETCH_CLASS exists or mapping an object back in the database是否存在与 PDO::FETCH_CLASS 相反的对象或将对象映射回数据库
【发布时间】:2014-08-10 03:31:06
【问题描述】:

使用 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);

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

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

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

【问题讨论】:

  • 不,我不这么认为。而且 PDO 不是 ORM!
  • 当然不是 :p
  • 但是Roll You Own不会花太多力气。

标签: php mysql oop pdo


【解决方案1】:

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

一旦没有其他对特定对象的引用,或在关闭序列期间以任何顺序调用,将立即调用析构函数。

来自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);
  }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 2013-02-14
    • 2012-07-18
    • 2022-12-10
    • 1970-01-01
    • 2018-10-28
    相关资源
    最近更新 更多