Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverstripe 保存记录前获取下一个ID_Silverstripe - Fatal编程技术网

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

Silverstripe 保存记录前获取下一个ID,silverstripe,Silverstripe,从技术上讲,是否可以在保存数据对象之前获取下一个ID?新记录的ID,到目前为止尚未创建 我提出的唯一解决方案是创建一个新表,每次创建类型为“x”的新数据对象时,我都会在其中保存最新的ID,然后进行计数。您可以先查询数据库: $nextId = MyDataobject::get()->sort('ID')->last()->ID + 1; 新记录的ID,到目前为止尚未创建 即使您确实获得了@schellmax建议的“ID”,您也无法确保在保存时可以使用相同的“ID”。这可能非

从技术上讲,是否可以在保存数据对象之前获取下一个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;
    }