gpt4 book ai didi

php - 如何确定类中的哪些属性应包含在 UPDATE 动态查询中?

转载 作者:行者123 更新时间:2023-11-29 23:09:01 25 4
gpt4 key购买 nike

图1:这是一个模型类示例

class Games {
public $id = 0;
public $date = null;
public $player1_id = 0;
public $player2_id = 0;
public $score = null;

public function save(){
if(empty($this->id)){
// do INSERT here
}
else{
// do UPDATE here
}
}
}

图2:这是该类的使用示例

// Save a new date to an existing game
$game = new Games;
$game->id = $input['id'];
$game->date = $input['date'];
$game->save();

如果基于 figure2 执行 UPDATE 查询,则 player1_idplayer2_idscore 将被错误地覆盖为零/空值。因此,我需要一种方法来从类内部确定某些属性未在 figure2 中的调用中设置,以便我可以动态更改 UPDATE 查询仅更新数据库中的特定字段。或者我的做法是错误的?

注意:我知道我可以使用单个 array 属性来保存所有字段(并使用 isset),但这感觉像是打破了模型的要点并且也将是非常特定于 PHP 的(因为该解决方案不能很好地转移到其他语言,例如数组类型严格的 JAVA?)。我还意识到我可以做我认为 ORM 所做的事情,并在执行更新之前进行初始 SELECT 查询(但这似乎非常低效!)

最佳答案

  1. 声明一个 PRISTINE 常量。尝试将其设置为您创建的对象的新实例,例如 new MyPristine。
  2. 在您的游戏构造函数中,将所有字段设置为该常量。这是将它们标记为“未触及”的技巧。您可以使用 Reflection (如 ReflectionClass($game)->getProperties() )来循环遍历所有这些
  3. 保存之前,再次循环遍历字段并使用 PRISTINE 测试它们的值。如果不同,则需要更改。

此解决方案假设没有人/没有其他人会在步骤 2 和 3 之间更改 Game 实例。这就是为什么大多数 ORM 会事先执行 SELECT 的原因。

关于php - 如何确定类中的哪些属性应包含在 UPDATE 动态查询中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28160428/

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