조금 혼란 스럽습니다. 필자는 다이렉트 메일 서비스에서 PHP RedBean을 ORM으로 적극적으로 사용하고 있습니다. 고유 키 제약 조건 (예 : subscriber_id, delivery_id)과이 테이블에 데이터를 쓰는 두 개의 스크립트가있는 테이블이 있습니다. 삽입되는 소스 코드 나 업데이트 테이블이 있습니다 :PHP RedBean 스토어 빈이 없으면 하나
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 "INSERT on duplicate key update"기능에 대해 알고 있습니다. 하지만 어떻게하면 ORM을 사용하여 동일한 결과를 얻을 수 있습니까?
당신이하려는 것은 "업서 트"라고합니다. 인터넷 검색을 시도해보십시오. 나는 이것에 대한 토론을 발견했다 : https://github.com/gabordemooij/redbean/issues/160 –