Ich bin ein wenig verwirrt. Ich benutze PHP RedBean als ORM aktiv in meinem Direct Mail-Dienst und ich stoße in eine seltsame Situation - ich habe eine Tabelle mit eindeutiger Schlüsseleinschränkung (d. H. Subscriber_id, delivery_id) und zwei Skripte, die Daten in diese Tabelle schreiben. Es gibt Quellcode, oder Aktualisierung Tabelle einfügen:PHP RedBean Shop-Bean, wenn nicht existiert ein
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);
}
Es genannt wird sowohl von zwei Skripten. Und ich habe regelmäßig Probleme mit der Beschränkung der Korruption auf diese Tabelle, weil Race-Bedingungen auftreten. Ich weiß über SQL "INSERT auf doppelte Schlüsselaktualisierung" Eigenschaft. Aber wie kann ich mit meinem ORM das gleiche Ergebnis erzielen?
Was Sie versuchen, ist ein "Upsert". Versuchen Sie dafür zu googeln. Ich habe diese Diskussion darüber gefunden: https://github.com/gabordemooij/redbean/issues/160 –