【发布时间】:2012-11-05 22:17:38
【问题描述】:
我有点困惑。我在直接邮件服务中积极使用 PHP RedBean 作为 ORM,但遇到了奇怪的情况 - 我有一个具有唯一键约束的表(即订阅者 ID、交付 ID)和两个将数据写入该表的脚本。 有源代码正在插入或更新表:
public static function addOpenPrecedent($nSubscriberId, $nDeliveryId)
{
$oOpenStatBean = \R::findOrDispense('open_stat', 'delivery_id = :did AND subscriber_id = :sid', array(':did' => $nDeliveryId, ':sid' => $nSubscriberId));
$oOpenStatBean = array_values($oOpenStatBean);
if (1 !== count($oOpenStatBean)) {
throw new ModelOpenStatException(
"Ошибка при обновлении статистики открытий: пара (delivery_id,
subscriber_id) не является уникальной: ($nDeliveryId, $nSubscriberId).");
}
$oOpenStatBean = $oOpenStatBean[0];
if (!empty($oOpenStatBean->last_add_dt)) {
$oOpenStatBean->precedent++;
} else {
$oOpenStatBean->delivery_id = $nDeliveryId;
$oOpenStatBean->subscriber_id = $nSubscriberId;
}
$oOpenStatBean->last_add_dt = time('Y-m-d H:i:s');
\R::store($oOpenStatBean);
}
它被两个脚本调用。而且我会定期在此表上遇到损坏唯一约束的问题,因为会发生竞争条件。我知道 SQL“插入重复键更新”功能。但是我怎样才能完全使用我的 ORM 获得相同的结果呢?
【问题讨论】:
-
您正在尝试做的事情被称为“upsert”。尝试谷歌搜索。我发现了这个讨论:github.com/gabordemooij/redbean/issues/160
标签: php mysql database orm redbean