Esempio n. 1
0
 /**
  * ReferenceDefinition ::= REFERENCES tbl_name (index_col_name,...)
  *  [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
  *  [ON DELETE reference_option]
  *  [ON UPDATE reference_option]
  *
  * @return \TYPO3\CMS\Core\Database\Schema\Parser\AST\ReferenceDefinition
  * @throws \TYPO3\CMS\Core\Database\Schema\Exception\StatementException
  */
 protected function referenceDefinition() : AST\ReferenceDefinition
 {
     $this->match(Lexer::T_REFERENCES);
     $tableName = $this->schemaObjectName();
     $this->match(Lexer::T_OPEN_PARENTHESIS);
     $referenceColumns = [];
     $referenceColumns[] = $this->indexColumnName();
     while ($this->lexer->isNextToken(Lexer::T_COMMA)) {
         $this->match(Lexer::T_COMMA);
         $referenceColumns[] = $this->indexColumnName();
     }
     $this->match(Lexer::T_CLOSE_PARENTHESIS);
     $referenceDefinition = new AST\ReferenceDefinition($tableName, $referenceColumns);
     while (!$this->lexer->isNextTokenAny([Lexer::T_COMMA, Lexer::T_CLOSE_PARENTHESIS])) {
         switch ($this->lexer->lookahead['type']) {
             case Lexer::T_MATCH:
                 $this->match(Lexer::T_MATCH);
                 $referenceDefinition->match = $this->lexer->lookahead['value'];
                 $this->lexer->moveNext();
                 break;
             case Lexer::T_ON:
                 $this->match(Lexer::T_ON);
                 if ($this->lexer->isNextToken(Lexer::T_DELETE)) {
                     $this->match(Lexer::T_DELETE);
                     $referenceDefinition->onDelete = $this->referenceOption();
                 } else {
                     $this->match(Lexer::T_UPDATE);
                     $referenceDefinition->onUpdate = $this->referenceOption();
                 }
                 break;
             default:
                 $this->syntaxError('MATCH, ON DELETE or ON UPDATE');
         }
     }
     return $referenceDefinition;
 }