- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个带有复合键( user_id , category_id )的 mysql 表;我正在尝试更新这些记录的最后访问权限,如下所示
$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
总是 true,这意味着 Yii 将使用 INSERT
语句而不是 UPDATE
将模型保存到数据库时的声明.. 这就是为什么你总是得到重复的 pk 错误,即使它是复合的。
Here是关于 IsNewRecord
的官方文档。所以,问题是你正在使用
$userCategory = new UserCategory; //Always a new record, tries to INSERT
因此,要解决此问题,您必须找到记录并在保存之前评估是否找到它。也可以阅读文档 Here关于 find()
系列方法及其返回值,find() 方法的返回值在性质上略有不同:
find..() returns the record found or
NULL
if no record is found.findAll..() returns an array containing all the records found or an empty array if no records are found.
您可以使用此返回值来区分主键是否存在:
$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/
我有一个带有复合键( user_id , category_id )的 mysql 表;我正在尝试更新这些记录的最后访问权限,如下所示 $userCategory = new UserCategory
问题 我有一个名为 Test 的 Sequelize 模型,它有一个唯一字段:value(主键)。我使用 SQLite 作为数据库管理系统。 如果我使用 ignoreDuplicates: true
我在我的模型中创建了一个 beforeSave 方法(扩展了 GXActiveRecord),if isNewRecord 永远不会被触发。不过,我的 beforeSave() 被调用了。 当我打印
在 Yii ActiveRecord 中,是否可以在模型构造函数中设置一个属性并仍然使模型的 isNewRecord 属性保持为真? 我有一个模型构造函数来创建一个私有(private)属性来保存 P
我正在尝试将 Sequelizes instance.save 方法存储在稍后调用的变量中。当我从该变量调用它时,它会抛出错误未处理的拒绝类型错误:无法读取未定义的属性“isNewRecord”。 保
我是一名优秀的程序员,十分优秀!