我有点困惑。我在我的直接邮件服务中积极使用 PHP RedBean 作为 ORM,但我遇到了奇怪的情况 - 我有一个具有唯一键约束的表(即,subscriber_id、delivery_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 获得相同的结果呢?