Схема базы данных Symfony Doctrine для разных баз данных - PullRequest
4 голосов
/ 26 июля 2011

У меня проблема с проектированием схемы базы данных Doctrine.Предположим, у меня есть 2 базы данных, A и B.

Я уже создал схему базы данных A, и теперь мне нужно создать схему базы данных B.В базе данных B одна из таблиц имеет отношение к таблице базы данных A.Это проблема, как я могу связать B с A?

Ответы [ 2 ]

2 голосов
/ 26 июля 2011

@ Дзиамид наполовину прав.

Технически нельзя объединить две таблицы в отдельную базу данных. Но вы можете притворяться, что это будет любое реальное вмешательство.

Настройка нескольких подключений к базе данных:

//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.

2 голосов
/ 26 июля 2011

Вы не можете иметь связь между таблицами в разных базах данных.Если вы это сделаете, вы получите ошибку ограничения внешнего ключа.Что вы можете сделать, однако, это оставить пустое поле относительный_идентификатор и вручную загрузить связанные данные из другого соединения.Например:

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);
...