123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346 |
- <?php
- /*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
- namespace Doctrine\DBAL\Schema;
- use Doctrine\DBAL\Platforms\AbstractPlatform;
- /**
- * An abstraction class for a foreign key constraint.
- *
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Steve Müller <st.mueller@dzh-online.de>
- * @link www.doctrine-project.org
- * @since 2.0
- */
- class ForeignKeyConstraint extends AbstractAsset implements Constraint
- {
- /**
- * Instance of the referencing table the foreign key constraint is associated with.
- *
- * @var \Doctrine\DBAL\Schema\Table
- */
- protected $_localTable;
- /**
- * Asset identifier instances of the referencing table column names the foreign key constraint is associated with.
- * array($columnName => Identifier)
- *
- * @var Identifier[]
- */
- protected $_localColumnNames;
- /**
- * Table or asset identifier instance of the referenced table name the foreign key constraint is associated with.
- *
- * @var Table|Identifier
- */
- protected $_foreignTableName;
- /**
- * Asset identifier instances of the referenced table column names the foreign key constraint is associated with.
- * array($columnName => Identifier)
- *
- * @var Identifier[]
- */
- protected $_foreignColumnNames;
- /**
- * @var array Options associated with the foreign key constraint.
- */
- protected $_options;
- /**
- * Initializes the foreign key constraint.
- *
- * @param array $localColumnNames Names of the referencing table columns.
- * @param Table|string $foreignTableName Referenced table.
- * @param array $foreignColumnNames Names of the referenced table columns.
- * @param string|null $name Name of the foreign key constraint.
- * @param array $options Options associated with the foreign key constraint.
- */
- public function __construct(array $localColumnNames, $foreignTableName, array $foreignColumnNames, $name = null, array $options = array())
- {
- $this->_setName($name);
- $identifierConstructorCallback = function ($column) {
- return new Identifier($column);
- };
- $this->_localColumnNames = $localColumnNames
- ? array_combine($localColumnNames, array_map($identifierConstructorCallback, $localColumnNames))
- : array();
- if ($foreignTableName instanceof Table) {
- $this->_foreignTableName = $foreignTableName;
- } else {
- $this->_foreignTableName = new Identifier($foreignTableName);
- }
- $this->_foreignColumnNames = $foreignColumnNames
- ? array_combine($foreignColumnNames, array_map($identifierConstructorCallback, $foreignColumnNames))
- : array();
- $this->_options = $options;
- }
- /**
- * Returns the name of the referencing table
- * the foreign key constraint is associated with.
- *
- * @return string
- */
- public function getLocalTableName()
- {
- return $this->_localTable->getName();
- }
- /**
- * Sets the Table instance of the referencing table
- * the foreign key constraint is associated with.
- *
- * @param \Doctrine\DBAL\Schema\Table $table Instance of the referencing table.
- *
- * @return void
- */
- public function setLocalTable(Table $table)
- {
- $this->_localTable = $table;
- }
- /**
- * @return Table
- */
- public function getLocalTable()
- {
- return $this->_localTable;
- }
- /**
- * Returns the names of the referencing table columns
- * the foreign key constraint is associated with.
- *
- * @return array
- */
- public function getLocalColumns()
- {
- return array_keys($this->_localColumnNames);
- }
- /**
- * Returns the quoted representation of the referencing table column names
- * the foreign key constraint is associated with.
- *
- * But only if they were defined with one or the referencing table column name
- * is a keyword reserved by the platform.
- * Otherwise the plain unquoted value as inserted is returned.
- *
- * @param \Doctrine\DBAL\Platforms\AbstractPlatform $platform The platform to use for quotation.
- *
- * @return array
- */
- public function getQuotedLocalColumns(AbstractPlatform $platform)
- {
- $columns = array();
- foreach ($this->_localColumnNames as $column) {
- $columns[] = $column->getQuotedName($platform);
- }
- return $columns;
- }
- /**
- * {@inheritdoc}
- *
- * @see getLocalColumns
- */
- public function getColumns()
- {
- return $this->getLocalColumns();
- }
- /**
- * Returns the quoted representation of the referencing table column names
- * the foreign key constraint is associated with.
- *
- * But only if they were defined with one or the referencing table column name
- * is a keyword reserved by the platform.
- * Otherwise the plain unquoted value as inserted is returned.
- *
- * @param \Doctrine\DBAL\Platforms\AbstractPlatform $platform The platform to use for quotation.
- *
- * @see getQuotedLocalColumns
- *
- * @return array
- */
- public function getQuotedColumns(AbstractPlatform $platform)
- {
- return $this->getQuotedLocalColumns($platform);
- }
- /**
- * Returns the name of the referenced table
- * the foreign key constraint is associated with.
- *
- * @return string
- */
- public function getForeignTableName()
- {
- return $this->_foreignTableName->getName();
- }
- /**
- * Returns the non-schema qualified foreign table name.
- *
- * @return string
- */
- public function getUnqualifiedForeignTableName()
- {
- $parts = explode(".", $this->_foreignTableName->getName());
- return strtolower(end($parts));
- }
- /**
- * Returns the quoted representation of the referenced table name
- * the foreign key constraint is associated with.
- *
- * But only if it was defined with one or the referenced table name
- * is a keyword reserved by the platform.
- * Otherwise the plain unquoted value as inserted is returned.
- *
- * @param \Doctrine\DBAL\Platforms\AbstractPlatform $platform The platform to use for quotation.
- *
- * @return string
- */
- public function getQuotedForeignTableName(AbstractPlatform $platform)
- {
- return $this->_foreignTableName->getQuotedName($platform);
- }
- /**
- * Returns the names of the referenced table columns
- * the foreign key constraint is associated with.
- *
- * @return array
- */
- public function getForeignColumns()
- {
- return array_keys($this->_foreignColumnNames);
- }
- /**
- * Returns the quoted representation of the referenced table column names
- * the foreign key constraint is associated with.
- *
- * But only if they were defined with one or the referenced table column name
- * is a keyword reserved by the platform.
- * Otherwise the plain unquoted value as inserted is returned.
- *
- * @param \Doctrine\DBAL\Platforms\AbstractPlatform $platform The platform to use for quotation.
- *
- * @return array
- */
- public function getQuotedForeignColumns(AbstractPlatform $platform)
- {
- $columns = array();
- foreach ($this->_foreignColumnNames as $column) {
- $columns[] = $column->getQuotedName($platform);
- }
- return $columns;
- }
- /**
- * Returns whether or not a given option
- * is associated with the foreign key constraint.
- *
- * @param string $name Name of the option to check.
- *
- * @return boolean
- */
- public function hasOption($name)
- {
- return isset($this->_options[$name]);
- }
- /**
- * Returns an option associated with the foreign key constraint.
- *
- * @param string $name Name of the option the foreign key constraint is associated with.
- *
- * @return mixed
- */
- public function getOption($name)
- {
- return $this->_options[$name];
- }
- /**
- * Returns the options associated with the foreign key constraint.
- *
- * @return array
- */
- public function getOptions()
- {
- return $this->_options;
- }
- /**
- * Returns the referential action for UPDATE operations
- * on the referenced table the foreign key constraint is associated with.
- *
- * @return string|null
- */
- public function onUpdate()
- {
- return $this->onEvent('onUpdate');
- }
- /**
- * Returns the referential action for DELETE operations
- * on the referenced table the foreign key constraint is associated with.
- *
- * @return string|null
- */
- public function onDelete()
- {
- return $this->onEvent('onDelete');
- }
- /**
- * Returns the referential action for a given database operation
- * on the referenced table the foreign key constraint is associated with.
- *
- * @param string $event Name of the database operation/event to return the referential action for.
- *
- * @return string|null
- */
- private function onEvent($event)
- {
- if (isset($this->_options[$event])) {
- $onEvent = strtoupper($this->_options[$event]);
- if ( ! in_array($onEvent, array('NO ACTION', 'RESTRICT'))) {
- return $onEvent;
- }
- }
- return false;
- }
- }
|