每一个 AR(ActiveRecord 的简称)
对象对应一条
数据库
记录,所以 AR 的 CRUD 操作也分为单个记录和多个记录的批量操作。
在数据库中新建一个 AR
上述两种方式的区别仅在于书写方式不同,其他没有区别。
更新数据库中的一个 AR
第一种方式首先从数据库 查询已有的记录,然后修改 属性值,再保存。
第二种方式直接构造一个新对象,并修改属性值。
再强制将 AR 对象的 post_id 属性指定为特定值,从而实现对已有记录的更新
第二种方式减少了一次数据库查询,效率较高。
但问题在于如果 AR 对象的更新引发了事件操作,那么在事件处理 函数中被处理的 AR 对象就是不完整的。
比如 AR 对象的 before_save 事件需要根据 AR 对象的 updated 属性值(对象最近一次保存到数据库的时间)来更新 缓存 文件。由于第二种方式我们没有从数据库查出已有对象,所以对象的 updated 属性就是空值。这会直接导致 before_save 事件中的代码出错。
所以除非确定不会产生问题,否则尽量不要使用第二种方式来更新对象。
删除数据库中的 AR
方式1-2是等价的,都是先查询出对象,再调用 destroy() 方法。这种方式的好处是可以在对象的事件处理函数中完成一些额外工作,例如清理缓存,或者删除 AR 对象对应的文件(例如 Photo 对象对应的照片文件)。
方式3是直接删除符合 条件的数据库记录,不需要先查询,性能更好,但是也没法引发事件处理函数。
建了一个数组,array(5,6,7,8,9);是要删除的数据的id,怎么用qee的操作一次全部删除呢?
在数据库中新建一个 AR
方式1:
$post = new Post();
$post->title = 'post title';
$post->body = 'post body';
$post->save();
方式2:
$post = new Post(array(
'title' => 'post title',
'body' => 'post body',
));
$post->save();
上述两种方式的区别仅在于书写方式不同,其他没有区别。
更新数据库中的一个 AR
方式1:
$post = Post::find('post_id = ?', $post_id)->query();
$post->title = 'new post title';
$post->body = 'new post body';
$post->save();
第一种方式首先从数据库 查询已有的记录,然后修改 属性值,再保存。
方式2:
$post = new Post(array(
'title' => 'post title',
'body' => 'post body',
));
$post->changePropForce('post_id', $post_id);
$post->save();
第二种方式直接构造一个新对象,并修改属性值。
再强制将 AR 对象的 post_id 属性指定为特定值,从而实现对已有记录的更新
第二种方式减少了一次数据库查询,效率较高。
但问题在于如果 AR 对象的更新引发了事件操作,那么在事件处理 函数中被处理的 AR 对象就是不完整的。
比如 AR 对象的 before_save 事件需要根据 AR 对象的 updated 属性值(对象最近一次保存到数据库的时间)来更新 缓存 文件。由于第二种方式我们没有从数据库查出已有对象,所以对象的 updated 属性就是空值。这会直接导致 before_save 事件中的代码出错。
所以除非确定不会产生问题,否则尽量不要使用第二种方式来更新对象。
删除数据库中的 AR
方式1:
$photo = Photo::find('photo_id = ?', $photo_id)->query();
$photo->destroy();
方式2:
Photo::meta()->destroyWhere('photo_id = ?', $photo_id);
方式3:
Photo::meta()->deleteWhere('photo_id = ?', $photo_id);
方式1-2是等价的,都是先查询出对象,再调用 destroy() 方法。这种方式的好处是可以在对象的事件处理函数中完成一些额外工作,例如清理缓存,或者删除 AR 对象对应的文件(例如 Photo 对象对应的照片文件)。
方式3是直接删除符合 条件的数据库记录,不需要先查询,性能更好,但是也没法引发事件处理函数。
建了一个数组,array(5,6,7,8,9);是要删除的数据的id,怎么用qee的操作一次全部删除呢?
ModelName::meta()->destroyWhere('id IN (?)', $idArray);