我最初是为 symfony 1.2 编写的,但我相信这一切都适用。
我在这个例子中使用 Symfony 1.2.4。我有两个数据库,主数据库和从属数据库
如果您要使用多个数据库,您需要做一些事情。
You will need separate schema files for both (master.schema.yml and slave.schema.yml)
To use build-sql and insert-sql, you will need multiple propel.ini files
You will need to add an attribute to your schema files to get them to build right
步骤1
使用两个单独的连接创建 databases.yml:
dev:
propel:
param:
classname: DebugPDO
test:
propel:
param:
classname: DebugPDO
all:
propel:
class: sfPropelDatabase
param:
classname: PropelPDO
dsn: mysql:dbname=master;host=xxx.xxx.xxx.xxx
username: uname
password: pass
encoding: utf8
persistent: true
pooling: true
master:
class: sfPropelDatabase
param:
classname: PropelPDO
dsn: mysql:dbname=slave;host=xxx.xxx.xxx.xxx
username: uname
password: pass
encoding: utf8
persistent: true
pooling: true
第2步
如前所述,您将需要两个模式文件。请注意,您需要为与表匹配的数据库定义一个包属性,在这种情况下,它是主连接的“lib.model.master”。
master.schema.yml
master:
_attributes:
package: lib.model.master
defaultIdMethod: native
my_table:
_attributes: { package: lib.model.master }
my_id: { type: INTEGER, size: '11', primaryKey: true, autoIncrement: true, required: true }
ETC.....
slave.schema.yml
slave:
_attributes:
package: lib.model.slave
defaultIdMethod: native
auctionp:
_attributes: { package: lib.model.slave }
ETC.....
第 3 步
您将需要创建单独的 propel.ini 文件。在这个例子中,我使用了 propel-master.ini 和 propel-slave.ini。这些文件中的每一个都需要针对它们各自的数据库进行配置。
第4步
您将需要一个好的批处理文件来使用推进工具构建您的数据库。我的看起来像这样:
从应用程序根目录:symfony build-model;cp 配置/slave-propel.ini 配置/propel.ini;symfony 推进:构建-sql;symfony 推进:插入-sql --no-confirmation;cp 配置/propel-master.ini 配置/propel.ini;symfony 推进:构建-sql;symfony 推进:插入-sql --no-confirmation;
第 5 步
如果您已经使用一个数据库构建了模型并且现在正在进行拆分,则需要清除 /lib/model。删除“map”和“om”目录以及根目录中的文件将帮助您避免冲突。
第 6 步
要在代码中使用这两个数据库,您需要在连接中添加一些内容,如下所示:
示例 1:
$object = self::doSelect($c, Propel::getConnection('master'));
示例 2:
$newObject->save(Propel::getConnection('slave'));
示例 3:
$con = Propel::getConnection("propel");
$sql = "ALTER TABLE runlinhp CHANGE class class_rat varchar(15)";
$stmt = $con->prepare($sql);
$stmt->execute();