Как добавить отношения во время выполнения, используя DBIx :: Class и Catalyst? - PullRequest
6 голосов
/ 13 февраля 2010

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

Так как я определяю это только во время выполнения, я не могу указать отношения has_many или own_to в модулях схемы для запуска.

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

У меня есть часть решения ниже:

$rs = $c->model('DB::system')->result_source;
$rs->add_relationship('locations','DB::place',{'foreign.fk0' => 'self.id'});

Таким образом, столбец fk0 будет отображать внешний ключ в первичном ключе местоположения id.

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

Ответы [ 2 ]

1 голос
/ 06 июля 2011

Я не верю, что вы можете переопределить эти отношения после того, как приложение уже запущено. По крайней мере, не отбрасывая существующие объекты DBIC и не создавая их заново. В этот момент было бы проще просто перезапустить приложение, я подозреваю.

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

Если это будет полезно для вас, я могу предоставить пример кода.

Модуль DBIx :: Class :: ResultSet :: View может обеспечить грубое приближение к тому, что вы ищете, позволяя вам выполнить произвольный код, но получая результаты в виде объектов DBIx.

Мое общее мнение о таких вещах заключается в том, что любой уровень абстракции (а ORM - это уровень абстракции) предназначен для облегчения жизни. Когда оно мешает вашему приложению делать то, что оно хочет, оно больше не облегчает жизнь и должно быть отброшено (для этого конкретного использования - не обязательно для каждого использования). По этой причине я бы предложил использовать DBI, как вы предложили в одном из ваших комментариев. Я подозреваю, что в этом случае это сделает вашу жизнь намного проще.

0 голосов
/ 13 октября 2011

Я сделал это, вызвав соответствующие методы для соответствующих источников результатов, например, $resultset->result_source-><relationship method>. Работает даже в активном приложении.

...