Symfony Doctrine Database Schema与不同数据库的关系

时间:2011-07-26 08:16:13

标签: symfony1 doctrine schema

我遇到了关于设计doctrine数据库模式的问题。

假设我有2个数据库,A和B.

我已经创建了数据库A模式,现在我需要创建数据库B模式。 在数据库B中,其中一个表与数据库A的表有关。 这就是问题, 我如何将B与A联系起来? 或者也许这是不可能的?

尽快需要帮助。

2 个答案:

答案 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的工作方式相同。