是否有相当于 PDO::FETCH_CLASS 的 INSERT 或 UPDATE?
Posted
技术标签:
【中文标题】是否有相当于 PDO::FETCH_CLASS 的 INSERT 或 UPDATE?【英文标题】:Is there an INSERT or UPDATE equivalent to PDO::FETCH_CLASS? 【发布时间】:2016-05-21 14:07:21 【问题描述】:我发现PDO::FETCH_CLASS
非常有用。我的课程映射到表格。我只是做一个
$query = $pdo->query("SELECT * FROM fixedTime WHERE
transmissionProgramID = '$transmissionProgramID'");
$query->setFetchMode(PDO::FETCH_CLASS, 'FixedTime');
瞧瞧。
我希望能够做相反的事情:即实例化一个对象,将值加载到 UPDATE 或 INSERT 并再次瞧。
已查看但无法确定是否可用。
【问题讨论】:
反过来需要你做一些工作,例如insert into object->table (name) values (object->name)
.
改用保湿器/脱水器,因为:php.net/manual/en/pdostatement.fetchobject.php#111744
@Axalix 预构造函数值分配对于将数据库中的原始数据转换为类中更有用的数据(例如,将日期时间字符串转换为 DateTime
对象)很有价值。
@Marty 我更喜欢构造函数来使其工作(实例化),当某些属性可能只能用类中的默认值实例化时,我可以在使用此类打开文件时看到它们。我不是魔术的忠实粉丝,当事情隐式发生时(尤其是当你应该在凌晨 3 点修复某人代码中的生产错误时)。
@Axalix 如果你不喜欢魔法,PHP 不是一个很好的语言选择:-P
【参考方案1】:
嗯,是的。在某种程度上,您可以使用类似的东西进行插入或更新。
但要实现这一点,你必须学习how to use PDO properly。因此,首先我们必须修复您的选择代码:
$sql = "SELECT * FROM fixedTime WHERE transmissionProgramID = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$transmissionProgramID]);
$stmt->setFetchMode(PDO::FETCH_CLASS, 'FixedTime');
$ftime = $stmt->fetch();
请看 - 我们在这里使用准备好的语句,无论如何你都应该使用它。同时,这是我们可以在更新中使用的 [半] 自动化的关键。因为使用准备好的语句,您可以使用对象本身为准备好的查询提供值。
所以,只要您有反映表字段的对象属性,您就可以使用如下代码:
$user = new stdClass();
$user->name = "foo";
$user->pass = "bar";
$sql = "INSERT INTO users VALUES (NULL, :name, :pass)";
$pdo->prepare($sql)->execute((array)$user);
但对于真正的自动化,您必须考虑使用 ORM,这正是您正在寻找的。例如,您可以查看Eloquent。因此,代码将像
一样简单明了$ftime = new fixedTime;
$ftime->value = time();
$ftime->save();
【讨论】:
以上是关于是否有相当于 PDO::FETCH_CLASS 的 INSERT 或 UPDATE?的主要内容,如果未能解决你的问题,请参考以下文章