2009-08-28 3 views
1

У меня есть две таблицы, которые должны быть объединены с помощью отношения внешнего ключа, к сожалению, они разделены на две разные базы данных.Symfony Propel: Join Query через разные базы данных

Мой вопрос в том, что это возможно для меня создать Criteria thingy, что позволяет мне создавать кросс-запрос соединения с базой данных?

ответ

3

Ответ «нет», не делая что-то экзотическое. Если вы посмотрите на источник объекта Criteria, он поддерживает только одно имя базы данных.

У вас есть два варианта:

1) Есть два запроса и сделайте сами присоединиться. Если вы не очень хорошо разбираетесь в своей конкретной базе данных, это тот, с которым нужно идти. Просто убедитесь, что каждый запрос включает ваше поле соединения, а затем заходит за один, пока вы просматриваете и добавляете от другого.

2) Настройте представление или хранимую процедуру в одной базе данных, которая вызывает вторую базу данных и фактически соединяется с таблицами. Насколько известно PHP, он работает только с одной базой данных. Я знаю, что Oracle может это сделать - MySql может быть с некоторой экспертной конфигурацией. (Больше, чем мой скудный мастерства.)

- обновление в ответ на ваш комментарий -

Я не сделал это так, я не имею образец кода. Вот как я это понял. (Сверху моей головы, так что не принимайте как евангелие ...)

Начните здесь с вашей конфигурации: http://www.symfony-project.org/book/1_2/08-Inside-the-Model-Layer#chapter_08_database_connections.

Предположим, что ваши две связи были названы «db1» и «db2».

Поставка имя базы данных при создании критериев объекта:

$crit1 = new Criteria("db1"); 
$crit2 = new Criteria("db2"); 

ли ваши выбирает на своих двух классов базы данных.

$dataOnes = DataOnePeer:doSelect($crit1); 
$dataTwos = DataTwoPeer::doSelect($crit2); 

Затем положить их вместе как-то ...

foreach ($dataOnes as $d1) { 
    $joinKey = $d1->getMyJoinColumn(); 
    $d2 = findByKey($dataTwos, $joinKey); 
    if (!empty($d2)) { 
     $d1->myD2 = $d2; 
    } 
} 

function findByKey($dataTwoArr, $key) { 
    foreach($dataTwoArr as $d2) { 
     if ($key == $d2->getMyJoinColumn()) { 
       return $d2; 
     } 
    } 
    return null; 
} 

Это предполагает 1-1 отношения. Вам нужно будет изменить для 1-много.

Удачи вам!

+0

Соединитесь со мной .. у вас есть пример для этого? – Graviton

Смежные вопросы