Symfony Propel: объединение запросов в разных базах данных - PullRequest
1 голос
/ 28 августа 2009

У меня есть две таблицы, которые должны быть соединены связью внешнего ключа, к сожалению, они разделены на две разные базы данных.

У меня вопрос: возможно ли мне создать вещь Criteria, которая позволит мне создать запрос на соединение между базами данных?

1 Ответ

3 голосов
/ 28 августа 2009

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

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

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

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

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

Я этого не делал, поэтому у меня нет примера кода. Вот как я это выясню. (От макушки моей головы, так что не принимайте Евангелие ...)

Начните здесь с вашей конфигурации: http://www.symfony -project.org / книга / 1_2 / 08-внутри-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-многие.

Удачи!

...