保存记录之前获取下一个ID

时间:2015-01-24 17:27:24

标签: silverstripe

在保存数据对象之前,技术上是否可以获取下一个ID?新的ID,直到现在还没有创建记录。

我想出的唯一解决方案是创建一个新表,每次创建一个类型为'x'的新数据对象时,我将保存最新的ID,而不是计数。

2 个答案:

答案 0 :(得分:3)

  

新的ID,直到现在还没有创建记录。

即使你确实得到了" ID"正如@schellmax建议你永远不要确定相同的" ID"可以在保存时使用。这个如果非常脆弱,可以在例如多个用户试图大约同时做同样的事情。

这是我在提交表单之前需要上传文件并将文件附加到记录的项目。

  1. 将记录保存在开头,无论是否提交。现在你有了该记录的官方ID
  2. 附加任何文件/其他DataObject,就像您已有记录一样。
  3. 提交表单时,可选择以不破坏其他正在使用记录的方式清理表格。
  4. 这样,无论发生什么情况以及有多少用户同时尝试此操作,您都拥有正确的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;