私は少し混乱しています。ダイレクト メール サービス内で PHP RedBean を ORM として積極的に使用していますが、興味深い状況に遭遇しました。一意のキー制約 (つまり、subscriber_id、delivery_id) を持つテーブルと、このテーブルにデータを書き込む 2 つのスクリプトがあります。テーブルを挿入または更新するソース コードがあります。
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);
}
2 つのスクリプトから両方とも呼び出されます。また、競合状態が発生するため、このテーブルの一意の制約が定期的に破損するという問題があります。SQLの「重複キー更新時のINSERT」機能について知っています。しかし、ORM を純粋に使用して同じ結果を得るにはどうすればよいでしょうか?