少し混乱します。私はダイレクトメールサービスでORMとしてPHP RedBeanを積極的に使用しています。興味深い状況に遭遇しています。ユニークなキー制約(subscriber_id、delivery_id)を持つテーブルと、このテーブルにデータを書き込む2つのスクリプトがあります。 挿入されたソースコードや更新テーブルがあります:PHP RedBeanストアbeanが存在しない場合は、
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を使って純粋に同じ結果を得ることができますか?
あなたがしようとしているのは「アップサート」と呼ばれています。グーグルでそれを試してみてください。私はそれについてのこのディスカッションを見つけました:https://github.com/gabordemooij/redbean/issues/160 –