Silverstripe 保存记录前获取下一个ID
从技术上讲,是否可以在保存数据对象之前获取下一个ID?新记录的ID,到目前为止尚未创建Silverstripe 保存记录前获取下一个ID,silverstripe,Silverstripe,从技术上讲,是否可以在保存数据对象之前获取下一个ID?新记录的ID,到目前为止尚未创建 我提出的唯一解决方案是创建一个新表,每次创建类型为“x”的新数据对象时,我都会在其中保存最新的ID,然后进行计数。您可以先查询数据库: $nextId = MyDataobject::get()->sort('ID')->last()->ID + 1; 新记录的ID,到目前为止尚未创建 即使您确实获得了@schellmax建议的“ID”,您也无法确保在保存时可以使用相同的“ID”。这可能非
我提出的唯一解决方案是创建一个新表,每次创建类型为“x”的新数据对象时,我都会在其中保存最新的ID,然后进行计数。您可以先查询数据库:
$nextId = MyDataobject::get()->sort('ID')->last()->ID + 1;
新记录的ID,到目前为止尚未创建
即使您确实获得了@schellmax建议的“ID”,您也无法确保在保存时可以使用相同的“ID”。这可能非常脆弱,如果多个用户几乎同时尝试做相同的事情,则可能会被破坏
下面是我为一个需要在提交表单之前上传文件并将其附加到记录中的项目所做的工作
ID
ID
。此外,除非有成百上千的用户同时执行此操作,否则性能影响应该最小
示例(不确定它是否能像我拆下来时那样工作):
你完全正确,是我的错。我也看了一下,但是@koodimyyra在这里肯定有正确的答案。你一开始是如何保存记录的?让用户通过点击“保存”按钮来执行此操作,还是您自动执行此操作?通过调用
$dataobject->write()自动执行此操作代码>。这样,在给用户表单之前,我们就有了ID
。然后表单(可能还有会话)可以只保留对该ID
的引用。您在何时何地调用它?当您第一次创建dataobject时:$dataobject=new dataobject()$dataobject->write()代码>。手动检索ID
的同一位置。但那将在onBeforeWrite中?但我不明白。数据对象上没有init函数,是吗?直到现在,我还不知道应该把它放在哪里,这样用户在点击“创建”按钮后就会得到一个写的对象。你能举个例子吗?
public function QuoteForm() {
$fields = new FieldList();
// Clears out quotes older than 7 days
Quote::removeEmptyQuotes();
// Get the quote.
$quote = $this->getQuote();
$yourName = new TextField(
'Name',
_t('QuoteForm.YourName', 'Your name')
);
$yourName->setAttribute('required', true);
$fields->push($yourName);
$uploadField = new UploadField(
'Files',
_t('QuoteForm.Files', 'Select file*'),
$quote->Files()
);
$uploadField->setRecord($quote);
$uploadField->setFolderName('quotefiles');
$uploadField->setConfig('canAttachExisting', false);
$uploadField->getValidator()->setAllowedExtensions(array(
'jpg', 'jpeg', 'png', 'gif', 'tiff',
'odt', 'pdf', 'rtf', 'txt',
'doc', 'docx',
'ppt', 'pptx',
'xls', 'xlsx'
));
$uploadField->setAttribute('required', true);
$fields->push($uploadField);
$actions = new FieldList(
new FormAction('saveQuoteRequest', _t('QuoteForm.Send', 'Send'))
);
return new Form($this, 'QuoteForm', $fields, $actions);
}
/*
* Selects quote based on possible QuoteID from request.
* If none are found / if the request param is empty,
* creates a new Quote.
*
* @return Quote
*/
protected function getQuote() {
$quote = null;
$quoteID = (int)Session::get('QuoteID');
if ($quoteID > 0) {
$quote = Quote::get()->byID($quoteID);
}
if ($quote === null) {
$quote = new Quote();
$quote->write();
}
Session::set('QuoteID', $quote->ID);
return $quote;
}