其他分享
首页 > 其他分享> > 为何Propel不保存此查询,并且也不给出任何错误?

为何Propel不保存此查询,并且也不给出任何错误?

作者:互联网

我有一个像这样的表集合:

日志,责任,用户

责任被重用-但是每个日志只承担一项不同的责任.每个职责只有一个用户.一个用户可以有多个职责(在多个日志上).我有一张桌子将它们连接在一起:

logbook_responsibility,具有三个列(每个列组成主键)-logbook_id,responsor_id和user_id,它们都是外键.在我的schema.xml中,此表设置为isCrossRef =“ true”.

更新对新用户的责任时,我以$_POST [‘responsibility’] [2] = 5,$_ POST [‘responsibility’] [7] = 2等形式传入$_POST数组.我有一个应该更新它们的函数:

public function updateResponsibilities($options = null)
{
  foreach ($options['responsibility'] as $k => $v) {      
    $user = UserQuery::create()
      ->filterByLogbook($this->logbook)
      ->findOneById($v);

    $logbookResponsibility = LogbookResponsibilityQuery::create()
      ->filterByLogbook($this->logbook)
      ->filterByResponsibilityId($k)
      ->findOne();

    if (is_null($user) || is_null($logbookResponsibility)) {
      break;
    }

    $logbookResponsibility->setUser($user)->save();
  }

  return true;
}

在这里,我循环浏览这些选项,使用提供的ID创建一个新用户,按当前日志进行过滤以确保允许他们负责此日志,并获取第一个.正常工作(与-> toArray()一起转储:

array(11) {
  ["Id"]=>
  int(2)
  ["CompanyId"]=>
  int(1)
  ["CurrentLogbookId"]=>
  int(1)
  ["OtherFieldsHere..."]=>
  // etc, etc

}

接下来,我获取一个LogbookResponsibility,再次根据当前日志和职责ID进行过滤.在此阶段,正确显示新用户ID:

array(3) {
  ["LogbookId"]=>
  int(1)
  ["ResponsibilityId"]=>
  int(1)
  ["UserId"]=>
  int(1)
}

然后,我使用先前抓取的用户更新此对象,然后保存.我这样做没有错误,之后检查该对象至少表明该对象已更新:

array(3) {
  ["LogbookId"]=>
  int(1)
  ["ResponsibilityId"]=>
  int(1)
  ["UserId"]=>
  int(2)
}

但是,在不碰其他任何东西的情况下,之后查看数据库,用户ID仍为1.我已经测试过运行查询,例如:

UPDATE logbook_responsibility SET user_id = 1 WHERE logbook_id = 1 AND responsibility_id = 1;

…这没有错误.

我的实际问题有两个:

1)为什么不节省? (这与我的交叉引用表有关吗?多于两列的交叉引用表是否存在问题?)

2)通常是否有更好的方法来完成设置? *(我尝试通过一个责任对象实现相同的目标,但是没有找到从那里更新logbook_responsibility的方法)*

乐于接受建议以及实际答案!

解决方法:

正如评论中所建议的那样,当我运行save()方法时,我使用了getLastExecutedQuery()来掌握实际的查询运行,这就是正在运行的查询(还说明了为什么没有错误):

UPDATE `logbook_responsibility` SET `USER_ID`=3 WHERE
  logbook_responsibility.LOGBOOK_ID=1 AND
  logbook_responsibility.RESPONSIBILITY_ID=1 AND
  logbook_responsibility.USER_ID=3;

如您所见,update语句在语法上是正确的,但问题似乎出在Propel如何更新主键上-这使我想知道为什么我将用户ID列作为主键的一部分?

将用户作为主键的一部分是没有意义的,所以我删除了它,当然这使它起作用.仍然存在真正的问题,“如何在Propel中更新主键?”,但是最好由somebody else来解释.

如果有人有更好的解释,我很乐意将其取消标记为答案.

标签:propel,mysql,php
来源: https://codeday.me/bug/20191127/2075654.html