102 lines
3.3 KiB
Plaintext
102 lines
3.3 KiB
Plaintext
|
+++ Introduction
|
||
|
|
||
|
Doctrine supports exporting record classes into database. This means that based on the definitions given in your record definitions Doctrine will alter your database schema.
|
||
|
|
||
|
Lets say we have a classes called User and Phonenumber with the following definitions:
|
||
|
|
||
|
<code type="php">
|
||
|
// file User.php
|
||
|
class User extends Doctrine_Record
|
||
|
{
|
||
|
public function setTableDefinition()
|
||
|
{
|
||
|
$this->hasColumn('name', 'string', 20);
|
||
|
}
|
||
|
public function setUp()
|
||
|
{
|
||
|
$this->hasMany('Phonenumber', array('local' => 'id',
|
||
|
'foreign' => 'user_id'));
|
||
|
}
|
||
|
}
|
||
|
// file Phonenumber.php
|
||
|
class Phonenumber extends Doctrine_Record
|
||
|
{
|
||
|
public function setTableDefinition()
|
||
|
{
|
||
|
$this->hasColumn('phonenumber', 'string', 20);
|
||
|
$this->hasColumn('user_id', 'integer');
|
||
|
}
|
||
|
public function setUp()
|
||
|
{
|
||
|
$this->hasOne('User', array('local' => 'user_id',
|
||
|
'foreign' => 'id',
|
||
|
'onDelete' => 'CASCADE'));
|
||
|
}
|
||
|
}
|
||
|
</code>
|
||
|
|
||
|
Now lets say these classes are in directory 'models/'. We can make Doctrine to iterate through this directory and attach these classes into your database structure with the following script:
|
||
|
|
||
|
<code type="php">
|
||
|
|
||
|
require_once('path-to-doctrine/lib/Doctrine.php');
|
||
|
|
||
|
spl_autoload_register(array('Doctrine', 'autoload'));
|
||
|
|
||
|
//in order to export we need a database connection
|
||
|
Doctrine_Manager::connection('mysql://user:pass@localhost/test');
|
||
|
|
||
|
Doctrine::createTablesFromModels('models');
|
||
|
</code>
|
||
|
|
||
|
This would execute the following queries on mysql.
|
||
|
|
||
|
<code type="sql">
|
||
|
CREATE TABLE user (id BIGINT AUTO_INCREMENT, name VARCHAR(20), PRIMARY KEY(id), INDEX(id));
|
||
|
CREATE TABLE phonenumber (id INT AUTO_INCREMENT, phonenumber VARCHAR(20), user_id BIGINT, PRIMARY KEY(id), INDEX(user_id));
|
||
|
ALTER TABLE phonenumber ADD CONSTRAINT FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE;
|
||
|
</code>
|
||
|
|
||
|
Pay attention to the following things:
|
||
|
|
||
|
# The autoincrement primary key columns are auto-added since we didn't specify any primary key columns
|
||
|
# Doctrine auto-adds indexes to the referenced relation columns (this is needed in mysql)
|
||
|
|
||
|
+++ Getting export queries
|
||
|
|
||
|
There might be situations where you don't want to execute the export queries immediately rather you want to get the query strings and maybe attach them to a build.sql file. This can be easily achieved as follows:
|
||
|
|
||
|
<code type="php">
|
||
|
require_once('path-to-doctrine/lib/Doctrine.php');
|
||
|
|
||
|
spl_autoload_register(array('Doctrine', 'autoload'));
|
||
|
|
||
|
Doctrine_Manager::connection('mgsql://user:pass@localhost/test');
|
||
|
|
||
|
$queries = Doctrine::generateSqlFromModels('models');
|
||
|
|
||
|
echo $queries;
|
||
|
</code>
|
||
|
|
||
|
Consider the same situation and you want to get the string of sql queries needed to perform the exporting. It can be achieved with Doctrine::generateSqlFromModels().
|
||
|
|
||
|
+++ Export options
|
||
|
|
||
|
<code type="php">
|
||
|
// export everything, table definitions and constraints
|
||
|
$manager = Doctrine_Manager::getInstance();
|
||
|
|
||
|
$manager->setAttribute(Doctrine::ATTR_EXPORT, Doctrine::EXPORT_ALL);
|
||
|
|
||
|
// export classes without constraints
|
||
|
|
||
|
$manager->setAttribute(Doctrine::ATTR_EXPORT, Doctrine::EXPORT_TABLES ^
|
||
|
Doctrine::EXPORT_CONSTRAINTS);
|
||
|
|
||
|
// turn off exporting
|
||
|
|
||
|
$manager->setAttribute(Doctrine::ATTR_EXPORT, Doctrine::EXPORT_NONE);
|
||
|
|
||
|
$sql = Doctrine::generateSqlFromModels();
|
||
|
</code>
|