为何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