I have TYPO3 version 7.6.18
$newMessage = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('Istar\\Femessages\\Domain\\Model\\Message');
$newMessage->setUserFrom($myUid);
$newMessage->setUserTo($userTo);
$newMessage->setChainUid($messageChainUid);
$newMessage->setMessage($message);
$this->messageRepository->add($newMessage);
$persistenceManager = $this->objectManager->get("TYPO3\\CMS\\Extbase\\Persistence\\Generic\\PersistenceManager");
$persistenceManager->persistAll();
Repository does't add new to DB without
$persistenceManager = $this->objectManager->get("TYPO3\\CMS\\Extbase\\Persistence\\Generic\\PersistenceManager");
$persistenceManager->persistAll();
Tell me please, why ?
答案 0 :(得分:3)
Extbase的持久性管理器启动,当请求完成并且您的操作完成后渲染视图并回答请求。这是设计原因以及为什么存储库只存储它必须更新或插入您给它的对象而不是实际执行它。
这种方法与延迟加载有关,只需在您真正需要时加载数据。查看您的对象,存储库会在您请求时将其发回给您。如果使用xDebug之类的调试器检查结果,您会注意到结果实际上不包含任何请求的对象,它只是Query的表示。只有在您需要时才会提取数据,例如,如果您在此toArray
对象上调用QueryResult
。
数据持久性也是如此。系统假定您不需要立即保留数据,因此它等待将数据发送到数据库,直到请求的所有处理完成为止。通过这种方式,可以将数据包含在较少的数据库连接中,这样可以节省时间。
如果您确实需要在添加对象后保留对象,则需要按照您所描述的方式调用PersistenceManager
。如果您想生成指向新的尚未存在的对象的链接,则可以这样做。
请记住,persistAll
方法执行它所说的内容,它会将所有更改保留给所有存储库的所有对象,直到执行该点。至少到目前为止,没有办法只保留一个特定的对象,我知道。