我遇到了关于设计doctrine数据库模式的问题。
假设我有2个数据库,A和B.
我已经创建了数据库A模式,现在我需要创建数据库B模式。 在数据库B中,其中一个表与数据库A的表有关。 这就是问题, 我如何将B与A联系起来? 或者也许这是不可能的?
尽快需要帮助。
答案 0 :(得分:2)
您不能在不同数据库中的表之间建立关系。如果这样做,最终会出现外键约束错误。但是,您可以做的是留下一个裸的relation_id字段并从另一个连接手动加载相关数据。例如:
Item:
columns:
store_id: integer(4)
#relations:
# Store:
# local: store_id
# foreign: id
# foreignAlias: Items
Store:
columns:
name: string(255)
class Item extends BaseItem
{
protected $_store = null;
public function getStore()
{
if (null == $this->_store)
{
$this->_store = Doctrine::getTable('Store')->findOneById($this->store_id);
}
return $this->_store;
}
public function setStore(Store $store)
{
$this->store_id = $store->id;
}
}
现在,您可以使用项目和商店,就像它们是相关的一样:
$item = new Item();
$store = new Store();
$store->save();
$item->setStore($store);
答案 1 :(得分:2)
@Dziamid是对的。
从技术上讲,您无法将两个表连接到单独的数据库。但你可以假装它会有任何真正的干预。
配置多个数据库连接:
//databases.yml
all:
items_db:
class: sfDoctrineDatabase
param:
dsn: mysql://login:passwd@localhost/items
stores_db:
class: sfDoctrineDatabase
param:
dsn: mysql://login:passwd@localhost/stores
为每个模型定义正确的连接
//schema.yml
Item:
connection: items_db
columns:
store_id: integer(4)
relations:
Store:
local: store_id
foreign: id
foreignAlias: Items
Store:
connection: stores_db
columns:
name: string(255)
现在您可以像往常一样使用您的Doctrine模型:
// like this
$item = new Item();
$store = new Store();
$store->save();
$item->setStore($store);
// or like this
$item->getStore();
唯一的限制是你不能在DQL查询中加入。
$query = Doctrine_Query::create()
->from('Store s')
->leftJoin('s.Items i')
->fetchAll();
但您可以使用Doctrine_Collections加载关系。
$stores = Doctrine::getTable('Store')->findAll(); // this returns a Doctrine_Collection
$stores->loadRelated('Items');
这与Doctrine_Query的工作方式相同。