Php 为什么不保存此查询,也不给出任何错误?

Php 为什么不保存此查询,也不给出任何错误?,php,mysql,propel,Php,Mysql,Propel,我有一组这样的表格: 日志,责任,用户 重复使用职责-但每个日志中只有一个明确的职责。每个职责有一个用户。一个用户可以有多个职责(在多个日志上)。我有一个表可以将这些连接在一起: logbook\u responsibility,带有三个列(每个列组成主键)logbook\u id、responsibility\u id和用户id,它们都是外键。在我的schema.xml中,此表设置为isCrossRef=“true” 当更新新用户的责任时,我在$\u POST中以$\u POST['respo

我有一组这样的表格:

日志
责任
用户

重复使用职责-但每个日志中只有一个明确的职责。每个职责有一个用户。一个用户可以有多个职责(在多个日志上)。我有一个表可以将这些连接在一起:

logbook\u responsibility
,带有三个列(每个列组成主键)
logbook\u id
responsibility\u id
用户id
,它们都是外键。在我的
schema.xml
中,此表设置为
isCrossRef=“true”

当更新新用户的责任时,我在
$\u POST
中以
$\u POST['responsibility'][2]=5
$\u POST['responsibility'][7]=2
等形式传递到一个数组中。我有一个应该更新它们的函数:

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()转储):

接下来,我抓取一个日志责任,再次根据当前日志和责任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列是否有问题?)

2)通常有更好的方法来实现我的设置吗*(我试图通过一个责任对象实现同样的目标,但没有找到从那里更新日志的方法)*


很乐意接受建议和实际答案

正如我在运行
save()
方法时使用的
getLastExecuteQuery()
获取实际查询运行的注释中所建议的,这就是正在运行的查询(也解释了没有错误的原因):

正如您所看到的,update语句在语法上是正确的,但问题似乎在于如何更新主键——这让我想知道为什么我将用户id列作为主键的一部分

将用户作为主键的一部分是没有意义的,所以我删除了它,当然这使它工作起来。仍然存在一个真正的问题,“我如何在推进中更新主键?”,但最好还是留下来解释一下


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

您可以使用
spreep::getConnection()->getLastExecutedQuery()检查上次运行的查询,这可能会为您指明正确的方向
UPDATE logbook_responsibility SET user_id = 1 WHERE logbook_id = 1 AND responsibility_id = 1;
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;