123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- = Model Introspection At Runtime =
- In addition to the object and peer classes used to do C.R.U.D. operations, Propel generates an object mapping for your tables to allow runtime introspection.
- The intospection objects are instances of the map classes. Propel maps databases, tables, columns, validators, and relations into objects that you can easily use.
- == Retrieving a TableMap ==
- The starting point for runtime introspection is usually a table map. This objects stores every possible property of a table, as defined in the `schema.xml`, but accessible at runtime.
- To retrieve a table map for a table, use the `getTableMap()` static method of the related peer class. For instance, to retrieve the table map for the `book` table, just call:
- {{{
- #!php
- <?php
- $bookTable = BookPeer::getTableMap();
- }}}
- == TableMap properties ==
- A `TableMap` object carries the same information as the schema. Check the following example to see how you can read the general properties of a table from its map:
- {{{
- #!php
- <?php
- echo $bookTable->getName(); // 'table'
- echo $bookTable->getPhpName(); // 'Table'
- echo $bookTable->getPackage(); // 'bookstore'
- echo $bookTable->isUseIdGenerator(); // true
- }}}
- Tip: A TableMap object also references the `DatabaseMap` that contains it. From the database map, you can also retrieve other table maps using the table name or the table phpName:
- {{{
- #!php
- <?php
- $dbMap = $bookTable->getDatabaseMap();
- $authorTable = $dbMap->getTable('author');
- $authorTable = $dbMap->getTablebyPhpName('Author');
- }}}
- To introspect the columns of a table, use any of the `getColumns()`, `getPrimaryKeys()`, and `getForeignKeys()` `TableMap` methods. They all return an array of `ColumnMap` objects.
- {{{
- #!php
- <?php
- $bookColumns = $bookTable->getColumns();
- foreach ($bookColumns as $column) {
- echo $column->getName();
- }
- }}}
- Alternatively, if you know a column name, you can retrieve the corresponding ColumnMap directly using the of `getColumn($name)` method.
- {{{
- #!php
- <?php
- $bookTitleColumn = $bookTable->getColumn('title');
- }}}
- The `DatabaseMap` object offers a shortcut to every `ColumnMap` object if you know the fully qualified column name:
- {{{
- #!php
- <?php
- $bookTitleColumn = $dbMap->getColumn('book.TITLE');
- }}}
- == ColumnMaps ==
- A `ColumnMap` instance offers a lot of information about a table column. Check the following examples:
- {{{
- #!php
- <?php
- $bookTitleColumn->getTableName(); // 'book'
- $bookTitleColumn->getTablePhpName(); // 'Book'
- $bookTitleColumn->getType(); // 'VARCHAR'
- $bookTitleColumn->getSize(); // 255
- $bookTitleColumn->getDefaultValue(); // null
- $bookTitleColumn->isLob(); // false
- $bookTitleColumn->isTemporal(); // false
- $bookTitleColumn->isEpochTemporal(); // false
- $bookTitleColumn->isNumeric(); // false
- $bookTitleColumn->isText(); // true
- $bookTitleColumn->isPrimaryKey(); // false
- $bookTitleColumn->isForeignKey(); // false
- $bookTitleColumn->hasValidators(); // false
- }}}
- `ColumnMap` objects also keep a reference to their parent `TableMap` object:
- {{{
- #!php
- <?php
- $bookTable = $bookTitleColumn->getTable();
- }}}
- Foreign key columns give access to more information, including the related table and column:
- {{{
- #!php
- <?php
- $bookPublisherIdColumn = $bookTable->getColumn('publisher_id');
- echo $bookPublisherIdColumn->isForeignKey(); // true
- echo $bookPublisherIdColumn->getRelatedName(); // 'publisher.ID'
- echo $bookPublisherIdColumn->getRelatedTableName(); // 'publisher'
- echo $bookPublisherIdColumn->getRelatedColumnName(); // 'ID'
- $publisherTable = $bookPublisherIdColumn->getRelatedTable();
- $publisherRelation = $bookPublisherIdColumn->getRelation();
- }}}
- == RelationMaps ==
- To get an insight on all the relationships of a table, including the ones relying on a foreign key located in another table, you must use the `RelationMap` objects related to a table.
- If you know its name, you can retrieve a `RelationMap` object using `TableMap::getRelation($relationName)`. Note that the relation name is the phpName of the related table, unless the foreign key defines a phpName in the schema. For instance, the name of the `RelationMap` object related to the `book.PUBLISHER_ID` column is 'Publisher'.
- {{{
- #!php
- <?php
- $publisherRelation = $bookTable->getRelation('Publisher');
- }}}
- alternatively, you can access a `RelationMap` from a foreign key column using `ColumnMap::getRelation()`, as follows:
- {{{
- #!php
- <?php
- $publisherRelation = $bookTable->getColumn('publisher_id')->getRelation();
- }}}
- Once you have a `RelationMap` instance, inspect its properties using any of the following methods:
- {{{
- #!php
- <?php
- echo $publisherRelation->getType(); // RelationMap::MANY_TO_ONE
- echo $publisherRelation->getOnDelete(); // 'SET NULL'
- $bookTable = $publisherRelation->getLocalTable();
- $publisherTable = $publisherRelation->getForeignTable();
- print_r($publisherRelation->getColumnMappings());
- // array('book.PUBLISHER_ID' => 'publisher.ID')
- print_r(publisherRelation->getLocalColumns());
- // array($bookPublisherIdColumn)
- print_r(publisherRelation->getForeignColumns());
- // array($publisherBookIdColumn)
- }}}
- This also works for relationships referencing the current table:
- {{{
- #!php
- <?php
- $reviewRelation = $bookTable->getRelation('Review');
- echo $reviewRelation->getType(); // RelationMap::ONE_TO_MANY
- echo $reviewRelation->getOnDelete(); // 'CASCADE'
- $reviewTable = $reviewRelation->getLocalTable();
- $bookTable = $reviewRelation->getForeignTable();
- print_r($reviewRelation->getColumnMappings());
- // array('review.BOOK_ID' => 'book.ID')
- }}}
- To retrieve all the relations of a table, call `TableMap::getRelations()`. You can then iterate over an array of `RelationMap` objects.
- Tip: RelationMap objects are lazy-loaded, which means that the `TableMap` will not instanciate any relation object until you call `getRelations()`. This allows the `TableMap` to remain lightweight for when you don't use relationship introspection.
|