【问题标题】:Phalcon - ORM Updating with save cause duplicate entriesPhalcon - ORM 更新保存导致重复条目
【发布时间】:2018-06-05 15:02:13
【问题描述】:

我与一个问题斗争了很长时间,但我找不到解决问题的好方法。

假设我有两张桌子:

uses (id, name)

uses_phone (id, user_id, phone)

假设我创建了一个users (1, 'Mary') 和她的手机users_phones (1, 1, '123') (2, 1, '333')

如果我想更新 Mary,将她的名字改为“Maria”:

save() 方法不会删除users_phone 中的实际记录,但会insert 新条目,然后我将拥有:

1, 1, 123 2, 1, 333 3, 1, 123 4, 1, 333

解决此问题的最佳方法是什么?我有点困惑。我喜欢使用 Model 而不是 PHQL(我也喜欢,但是带有 ORM 的 Model 似乎很神奇)。

编辑:添加代码

我更新了我的帖子以包含模型关系和我的控制器的简化版本

模型关系:

class Users {
  ...
  $this->hasMany('xid', 'UsersTelephones', 'xid_user', ['alias' => 'UsersTelephones']);
  ...
}

class UsersTelephones { 
   ...
   $this->belongsTo('xid_user', '\Users', 'xid', ['alias' => 'Users']);
   ...
}

(非常简化)控制器代码:

function update($xid) {
   ...
   $user = Users::findFirstByXid($xid);
   // $user->email = "..";

   $user_tfs = array();
   for ($i=0;$i<count($tfs_array);$i++)
   {
      $user_tfs[$i] = new UsersTelephones();
      $user_tfs[$i]->tf_number = $tfs_array[$i];
   }
   $user->UsersTelephones = $user_tfs;

   // ...

   $user->save()
}

感谢阅读,请原谅我的英语不好。

【问题讨论】:

  • 你能用保存记录的代码更新你的问题吗?也一定要检查你的模型 afterSave() 或其他类似的事件方法。
  • 另外,发布您拥有的任何模型关联定义。
  • 感谢两位的评论,我已经更新了我的问题,请查看。谢谢!
  • 这里也一样。找不到这种行为的原因。我已经完全禁用了更新/保存关系的处理。而当我想存储关系时,我不会像$user-&gt;phone = $phoneObject;那样分配对象,而是直接分配数字ID,例如$user-&gt;phoneId = $phoneObject-&gt;getId();

标签: model-view-controller orm phalcon phalcon-orm


【解决方案1】:

查看您的控制器代码,我有一些建议:

1) 首先,$tfs_array 来自哪里?

2) 您可能还想将现有电话记录的 id 添加到 $user_tfs[$i] 对象,例如:$user_tfs[$i]-&gt;id = $tfs_array[ID_OF_RECORD];(您需要将记录 ID 添加到 $tfs_array)。这样,ORM 可以解释该记录已经存在,因为该对象有一个 id 主键。

3) 如果您只想保存新名称,为什么还要迭代添加 UsersTelephones 对象?你可以这样:

$user = Users::findFirstByXid($xid);
$user->name = 'New Name';
$user->save();

4) 您也可以调用$model-&gt;update() 方法而不是save()。

这里有更多链接: https://docs.phalconphp.com/en/3.2/db-models#create-update-records https://docs.phalconphp.com/en/3.2/db-models#create-update-with-confidence https://docs.phalconphp.com/en/3.2/db-models-relationships#updating-related-records

【讨论】:

  • 您好! $tfs_array 只是来自先前验证/等的字符串向量。问题是我从POST 获得了一个新的$tfs_array,如果我删除一个ID,分配一个ID 将如何工作? (我正在编辑所有内容,因为用户有很多字段[在用户和其他表中],并且希望避免检查差异:/)
  • Users::findFirstByXid($xid); 还应该获取与该用户关联的电话记录。
  • 我如何删除/更新当前的电话?如果没有分配一个空数组,我不知道如何删除它们
  • 嗯,我想我会在有时间的时候尝试update(),谢谢你的回答,我投了赞成票。当我测试它时,我会检查问题是否已解决:-)
猜你喜欢
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
相关资源
最近更新 更多