Php 推进多数据库建模

Php 推进多数据库建模,php,database-design,model,propel,Php,Database Design,Model,Propel,我刚刚开始使用Propel,我很喜欢它,但是我有一个关于如何利用多个数据库连接的问题。我知道我可以在模式中设置连接到多个不同数据库的内容,但我很好奇如何在代码中处理这个问题 我遇到的问题是多个数据库,每个数据库都有稍微不同的模式,没有数据仓库。因此,我有以下类似的情况: databaseName: westCoastUsers table: users column1: email column2: password column3: FirstName databaseName: eastC

我刚刚开始使用Propel,我很喜欢它,但是我有一个关于如何利用多个数据库连接的问题。我知道我可以在模式中设置连接到多个不同数据库的内容,但我很好奇如何在代码中处理这个问题

我遇到的问题是多个数据库,每个数据库都有稍微不同的模式,没有数据仓库。因此,我有以下类似的情况:

databaseName: westCoastUsers
table: users
column1: email
column2: password
column3: FirstName

databaseName: eastCoastUsers
table: users
column1: email
column2: password
column3: firstName
column4: lastName
现在在PHP非推进版本中,我手动完成所有这些操作,并根据需要手动切换数据库。我希望把事情简化一点,我很好奇如何建模。是否有一种方法可以让eastCoastUser和westCoastUser模型引用适当的数据库/etc,或者我是否试图插入不受支持的内容

我读过这篇文章:但我不确定如何在代码中实际执行它


感谢架构文件中的帮助,您可以为表示表的类提供名称。它们不必使用与表相同的名称。您可以使用table元素上的
phpName
属性来执行此操作

例如,schema.xml可以包含如下内容

<database name="westCoastUsers">
  <table name="users" phpName="WestCoastUser">
    ...columns here...
  </table>
  ...
</database>
<database name="eastCoastUsers">
  <table name="users" phpName="EastCoastUser">
    ...columns here...
  </table>
</database>

…这里的列。。。
...
…这里的列。。。
(编辑,请注意,database元素上的
name=“westCoastUser”
指的是数据库的名称,而不是具有类似名称的类)


然后,在构建时,Prope将生成
Westcoast用户
Westcoast用户查询
Westcoast用户查询
Eastcoast用户查询
和,
Eastcoast用户查询
。每个类都将使用在模式中定义的数据库进行连接。

我最初是为symfony 1.2编写的,但我相信它都适用

我在这个例子中使用symfony1.2.4。我有两个数据库,master和slave

如果要使用多个数据库,则需要做一些事情

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
第一步

使用两个单独的连接创建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 }
slave:
 _attributes:
 package: lib.model.slave
 defaultIdMethod: native
 auctionp:
 _attributes: { package: lib.model.slave }
等等

slave.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 }
slave:
 _attributes:
 package: lib.model.slave
 defaultIdMethod: native
 auctionp:
 _attributes: { package: lib.model.slave }
等等

步骤3

您需要创建单独的spreep.ini文件。在本例中,我使用了spreep-master.ini和spreep-slave.ini。这些文件中的每一个都需要为各自的数据库进行配置

步骤4

您需要一个好的批处理文件来使用推进工具构建数据库。我的看起来像这样:

从应用程序根目录: symfony构建模型;cp配置/slave-spreep.ini配置/spreep.ini;symfony推进:构建sql;symfony推进:插入sql——无确认;cp配置/spreep-master.ini配置/spreep.ini;symfony推进:构建sql;symfony推进:插入sql——无确认

步骤5

如果您已经使用一个数据库构建了您的模型,并且现在正在进行拆分,则需要清除/lib/model。删除“map”和“om”目录以及根目录中的文件将有助于避免冲突

步骤6

要在代码中使用这两个数据库,需要向连接中添加一点,如下所示:

databaseName: westCoastUsers
table: users
column1: email
column2: password
column3: FirstName

databaseName: eastCoastUsers
table: users
column1: email
column2: password
column3: firstName
column4: lastName
例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();

你能解释一下你想如何使用这些数据吗?您希望使用
UserQuery
搜索这两个数据库吗?或者,你希望西海岸的网站用户搜索一个数据库,而东海岸的用户搜索另一个数据库吗?这看起来正是我想要/需要的。我将测试这些东西,并在本周末前发布/奖励。感谢Joeshmo的快速回复。