我有一个带有复合键的 mysql 表( user_id , category_id );
我正在尝试更新这些记录的最后一次访问,如下所示

$userCategory = new UserCategory;
$userCategory->user_id = 1;
$userCategory->category_id = 15;
echo $userCategory->isNewRecord; //always true
$userCategory->last_access = Now();

$userCategory->save();

{$userCategory->isNewRecord} 并且当我尝试 save() 时,MySQL 会为复合主键生成重复错误。

我也将此添加到 UserCategory 模型但没有帮助
public function primaryKey() {
        return array('user_id', 'category_id');
    }

****更新:
对困惑感到抱歉。我的问题是如何在 Yii 框架中实现与“ON DUPLICATE KEY UPDATE”相同的结果。换句话说,如何在一个 SQL 查询中进行插入或更新。如果您查看 save() 的源代码
public function save($runValidation=true,$attributes=null)
{
    if(!$runValidation || $this->validate($attributes))
        //checking if new record
        return $this->getIsNewRecord() ? $this->insert($attributes) : $this->update($attributes);**
    else
        return false;
}

最佳答案

实际上,问题在于,如果 isNewRecord 始终为真,则意味着 Yii 将在将模型保存到数据库时使用 INSERT 语句而不是 UPDATE 语句。这就是为什么你总是得到重复的 pk 错误,即使它是复合的。
Here 是关于 IsNewRecord 的官方文档。所以,问题是你正在使用

$userCategory = new UserCategory; //Always a new record, tries to INSERT
因此,要解决此问题,您必须先找到记录并评估是否在保存之前找到它。也可以阅读关于 find() 方法族及其返回值的 Here 文档,find() 方法的返回值在性质上略有不同:

您可以使用此返回值来区分主键是否存在:
$userCategory = UserCategory::model()->findByAttributes(array('user_id '=>1,'category_id '=>15));
// if user does not exist, you need to create it
if ($userCategory == NULL) {
     $userCategory = new UserCategory;
     $userCategory->user_id = 1;
     $userCategory->category_id = 15;
}
echo $userCategory->isNewRecord; //you will see the difference if it does exist or not exist
$userCategory->last_access = Now();
$userCategory->save();
这将确保框架正确使用 INSERT 或 UPDATE 语句,避免出现重复的 PK 错误。
编辑: 增强了示例代码以在新记录时正确填充记录。

关于php - Yii 复合主键与 isNewRecord,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15201769/

10-13 06:52