CakePHP - $ hasAndBelongsToMany и $ hasMany связаны между таблицами, которые находятся в разных базах данных и имеют разные языки запросов? - PullRequest
0 голосов
/ 31 июля 2010

У меня довольно сложная проблема, чтобы рассказать вам о Stackoverflow, вы видите, у меня есть три таблицы, которые мне нужны для определения связей между приложениями.Эти таблицы: инженеры, билеты и тестовые случаи.Мне нужны отношения $ hasMany между инженерами и тикетами, а также отношения hasAndBelongsToMany между тестами и тикетами.Здесь улов, инженеры и тестовые сценарии находятся в базе данных mysql, а заявки - в базе данных sqlite3 (trac) на отдельном сервере.Отдельная серверная часть не является проблемой, потому что сервер установлен на той же машине, на которой находится мое приложение.Мне в основном интересно, как бы вы настроили эти отношения, чтобы при загрузке каждой модели загружались и ее зависимости.Я буду буквально использовать практически любое решение, которое выполнит работу.Кстати, я использую CakePHP.

Ответы [ 3 ]

1 голос
/ 31 июля 2010

Ассоциации HABTM не поддерживаются в нескольких базах данных в CakePHP.Для того, чтобы сделать ассоциации вам нужно будет изменить ядро.По крайней мере, один человек достиг этого.Посмотрите на его метод .

1 голос
/ 31 июля 2010

Вы можете просто , а не определить ассоциацию и выполнить запрос вручную. То есть, вы связываете модель Ticket с ее таблицей соединений HABTM TestcaseTickets в отношении ownTo (при условии, что они оба находятся в базе данных SQLite) и запрашиваете ее вручную:

$testcases = $this->Testcase->find(…);
$tickets = $this->Ticket->TestcaseTickets->find('all', array(
    'conditions' => array(
        'TestcaseTickets.testcase_id' => Set::extract('/Testcase/id', $testcases)
    )
));

Это отнимает немного удобства, но не имеет большого значения в конце, особенно если вы делаете это автоматически в обратном вызове afterFind модели Testcase.

0 голосов
/ 31 июля 2010

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

Обычно вам нужно 2 строки подключения в вашем /app/config/database.php, то есть:

class DATABASE_CONFIG {

    var $mysql = array(
        'driver' => 'mysql',
        'persistent' => false,
        'host' => 'localhost',
        'login' => 'user',
        'password' => 'password',
        'database' => 'database',
        'prefix' => '',
        'encoding'=>'utf8'
    );

    var $sqlite = array(
        'driver' => 'sqlite',
        'persistent' => false,
        'host' => 'localhost',
        'login' => 'user',
        'password' => 'password',
        'database' => 'database',
        'prefix' => '',
        'encoding'=>'utf8'
    );
}

кстати.Я не совсем уверен насчет драйвера sqlite, но так и должно быть.

И, наконец, вам нужно указать для каждой модели, какое соединение использовать.Это можно сделать с помощью:

class tickets extends AppModel {
   ...
   var $useDbConfig = 'sqlite';
   ...
}

И особенно если вы не используете никаких специальных SQL-хаков, это должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...