Я создаю События и хочу связать их в консолидированные объекты, соответствующие заголовку, поэтому я создал репозиторий EventBundle, который содержит эти объекты, и регистрирую отдельные события, сопоставляя их по заголовку в Пакеты.
Поскольку у меня много проблем с их сохранением, я уже зашел так далеко, что их локально кешировали, что несколько помогает, но все же это довольно плохо.
public function registerEvent($event) {
//We are matching with the title of the event so we get that first
$title = $event->getEvTitle();
if(!isset($this->aBundles[$title]))
//Then we look up the event bundle for this title, if it does not exist this will return null
$this->aBundles[$title] = $this->findEventBundleByTitle($title);
if($this->aBundles[$title] != NULL) {
$this->aBundles[$title]->copyDetails($event);
$this->aBundles[$title]->setEvTitle($title);
$this->update($this->aBundles[$title]);
print_r("Update: $title\n");
}
else {
$objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');
$this->aBundles[$title] = $objectManager->get('Ext\MyEvents\Domain\Model\EventBundle');
$this->aBundles[$title]->copyDetails($event);
$this->aBundles[$title]->setEvTitle($title);
$this->add($this->aBundles[$title]);
print_r("Add: $title\n");
}
}
public function findEventBundleByTitle($title){
$query = $this->createQuery();
$query->getQuerySettings()->setRespectStoragePage(FALSE);
$query->matching(
$query->equals('ev_title', $title)
);
$res = $query->execute();
$bundle = ($res->count()==0?NULL:$res->getFirst());
return $bundle;
}
Теперь, запустив это, я ожидал увидеть по одному добавлению для каждого заголовка, а затем обновления - что верно для первого запуска.
Но при последующих запусках снова появляются некоторые добавления, некоторые события не соответствуют названию. С каждым последующим запуском добавляется все меньше и меньше, пока не появятся только обновления. Но при просмотре базы данных она показывает несколько записей с одинаковым названием. Уникальный индекс также вызовет ошибки при втором запуске, так как поиск объекта не удастся, иногда без какого-либо шаблона.
Есть идеи, почему это может произойти? Я могу проверить, чтобы увидеть записи в базе данных между запусками, так что, скорее всего, поиск по какой-то причине не удался. Но у меня совершенно нет идей, почему это может иметь место, поскольку в конечном итоге это работает, но в некоторых случаях в базе данных может быть гораздо больше, чем просто 1-2 записи ...
Также сбивает с толку тот факт, что после 5 запусков все события совпадают согласованно с некоторыми событиями, находящимися в базе данных 5 раз в данный момент времени. Но все совпадения относятся к ПЕРВЫМ из этих записей, поэтому запрос не совпадает с запросом, он просто игнорируется, пока их не становится достаточно?!, Все записи, созданные из-за поиска в базе данных, ничего не возвращающего, игнорируются после этого точка. Удаление их из базы данных вручную возобновляет добавление поддельного контента.