在保存数据对象之前,技术上是否可以获取下一个ID?新的ID,直到现在还没有创建记录。
我想出的唯一解决方案是创建一个新表,每次创建一个类型为'x'的新数据对象时,我将保存最新的ID,而不是计数。
答案 0 :(得分:3)
新的ID,直到现在还没有创建记录。
即使你确实得到了" ID"正如@schellmax建议你永远不要确定相同的" ID"可以在保存时使用。这个如果非常脆弱,可以在例如多个用户试图大约同时做同样的事情。
这是我在提交表单之前需要上传文件并将文件附加到记录的项目。
ID
。这样,无论发生什么情况以及有多少用户同时尝试此操作,您都拥有正确的ID
。除非您有数百或数千名用户同时执行此操作,否则性能影响应该是最小的。
示例(不确定它是否正如我将其剥离一样):
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;
}
答案 1 :(得分:0)
您可以先查询数据库:
$nextId = MyDataobject::get()->sort('ID')->last()->ID + 1;