我有一个带有复合键的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();
Run Code Online (Sandbox Code Playgroud)
{$ userCategory-> isNewRecord}当我尝试save()时,MySQL会为复合主键生成重复错误.
我还将此添加到UserCategory模型但没有帮助
public function primaryKey() {
return array('user_id', 'category_id');
}
Run Code Online (Sandbox Code Playgroud)
****更新:对不起,请注意.我的问题是如何在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;
}
Run Code Online (Sandbox Code Playgroud)
实际上,问题是如果isNewRecord总是如此,那意味着在将模型保存到数据库时,Yii将使用INSERT语句而不是UPDATE语句.这就是为什么你总是得到重复的pk错误,即使它是复合的.
这是关于的官方文档IsNewRecord.所以,问题是你正在使用
$userCategory = new UserCategory; //Always a new record, tries to INSERT
Run Code Online (Sandbox Code Playgroud)
因此,要解决此问题,您必须找到记录并评估是否在保存之前找到它,而不是.文档也可以在这里阅读有关find()方法系列及其返回值的信息,find()方法的返回值在性质上略有不同:
find ..()返回找到的记录或者
NULL没有找到记录.findAll ..()返回一个包含找到的所有记录的数组,如果没有找到记录则返回一个空数组.
您可以使用此返回值来区分是否存在主键:
$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();
Run Code Online (Sandbox Code Playgroud)
这将确保框架正确使用INSERT或UPDATE语句,从而避免您获得的重复PK错误.
编辑:增强了示例代码,以便在新记录时正确填充记录.
如果您尝试更新,则应该加载记录,而不是创建新记录。
UserCategory::model()->findByPk(array('user_id'=> 1,'category_id '=> 15));
$userCategory->last_access = Now();
$userCategory->save();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3999 次 |
| 最近记录: |