2010-02-13 3 views
6

내가 만들고있는 응용 프로그램에서 사용자는 테이블 간의 관계를 지정할 수 있습니다.DBIx :: Class와 Catalyst를 사용하여 런타임에 관계를 어떻게 추가합니까?

런타임시에만이를 결정하기 때문에 시작할 때 스키마 모듈에서 has_many 또는 belongs_to 관계를 지정할 수 없습니다.

주어진 두 테이블; 시스템 및 장소에 관계를 추가하려면 관계를 추가하여 두 레코드 사이에 합류하십시오.

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

그래서 열 fk0id 키 위치 주에 외래 키 매핑 될 것이다 :

나는 아래의 솔루션의 일부를 가지고있다.

향후 관계에 액세스 할 수 있도록 재 등록해야한다는 것을 알고 있지만 알아낼 수는 없습니다.

+3

사용자가 정말로 데이터베이스 스키마를 변경 하시겠습니까? 이는 소스 코드를 편집 할 수있는 것과 완전히 같습니다. "사용자 인터페이스"를 DBIx :: Class로 모델링 할 필요는 없습니다. 원하는 기능을 제공하는 중간 표현을 개발하고 코드 및 데이터베이스 스키마를 고정시키고 자 할 수도 있습니다. – jrockway

+1

DBIx :: Class :: Schema :: Loader도 있습니다. 제어하지 않는 데이터베이스 또는 그와 유사한 것을 추적하는 경우. 그러나 데이터베이스 스키마 변경은 응용 프로그램의 동작을 변경합니다. 코드가 정적이고 데이터베이스 스키마가 동적 인 경우 거의 확실한 문제가 있습니다. – jrockway

+0

실제 데이터베이스에 내 스키마/데이터 사전을 중첩하여 사용할 가능성을 모색 중입니다. 저는 'columns'테이블과 'tables'테이블을 가지고 있습니다. 이것들은 사용자가 선택한 테이블과 컬럼 이름과 속성을 기본 제네릭 테이블 스페이스에 매핑하는 데 사용됩니다. 따라서 사용자는 런타임에 테이블간에 관계를 추가 할 수 있습니다. DBIx를 통해이 관계에 액세스하고 싶습니다. 일반 스키마를 숨기고이 기능이 필요한 중간 인터페이스를 구축하고 있습니다. 감사합니다. -Joe – Joe

답변

1

응용 프로그램이 이미 실행 된 후에 이러한 관계를 다시 정의 할 수 있다고 생각하지 않습니다. 적어도 기존의 DBIC 객체를 버리고 모든 것을 처음부터 재 작성하지 않아도됩니다. 이 시점에서 응용 프로그램을 다시 시작하는 것이 더 쉬울 것입니다.

에서 이러한 내용을 동적으로 정의하는 내용이라면 시간을 컴파일 할 수 있습니다. 우리는 우리 응용 프로그램 중 하나에서 비슷한 작업을 수행합니다.

그게 도움이된다면 몇 가지 샘플 코드를 제공 할 수 있습니다.

DBIx::Class::ResultSet::View 모듈은 임의의 코드를 실행하고 결과를 DBIx 객체로 검색함으로써 대략적인 근사치를 제공 할 수 있습니다.

이런 식의 일반적인 견해는 모든 추상화 계층 (및 ORM은 추상화 계층)이 삶을 편하게하기위한 것입니다. 애플리케이션이 원하는대로 작동하도록 만드는 과정에서 더 이상 인생을 더 쉽게 만들어주지 않으며, 폐기해야합니다 (특정 용도로 - 반드시 모든 용도에 사용되는 것은 아닙니다). 이러한 이유 때문에 DBI를 사용하는 것이 좋습니다. 나는 그것이 당신의 삶을이 경우 훨씬 쉽게 만들 것이라고 생각한다.

+0

+1은 "길에 들어 왔을 때 ..."라고 말합니다. 내가 아직도 선호하는 이유 중 하나는 Class :: DBI (DBIC보다)입니다. – RET

0

관련 결과 소스에 적절한 메소드를 호출하여이를 수행했습니다. $resultset->result_source-><relationship method>. 활성 응용 프로그램에서도 작동합니다.