/ / Jak utworzyć relację DBIx :: Class ze stałym warunkiem łączenia? - perl, klasa dbix

Jak utworzyć relację DBIx :: Class ze stałym warunkiem łączenia? - perl, klasa dbix

Mamy tabelę linków, która może obsługiwać wiele typów obiektów po jednej stronie, i nie mogę się dowiedzieć, jak dostać się z jednego z tych obiektów do tabeli linków za pomocą has_many.

Przykład: tabela linków zawiera:

id link_id link_table resource_id
1  1       page       3
2  1       page       5
3  2       page       3
4  1       not_page   1

Budowanie relacji ze strony zasobów jest łatwe:

Resource->has_many(links => "Link", "resource_id");

ale nie udało mi się uzyskać odpowiedniego powiązania ze strony:

Page->has_many(links => "Link", "link_id");

otrzyma link not_page

Page->has_many(links => "Link", {"foreign.link_id" => "self.id", "foreign.link_table" => "page"});

podaje błąd "Niepoprawna strona błędu" (co nie było dla mnie zaskakujące).

Page->has_many(links => "Link", {"foreign.link_id" => "self.id", "foreign.link_table" => ""page""});

podaje błąd "Nieważny błąd warunkowy". Rzucanie backslashes nie pomogło.

DBIx :: Class :: Relationship :: Base mówi:

Warunkiem musi być SQL :: Streszczeniereprezentacja łączenia między tabelami

i wypróbowałem różne różne opcje, takie jak:

Page->has_many(links => "Link", {"foreign.link_id" => "self.id", "foreign.link_table" => {"=", "page"}});

ale bez żadnego sukcesu.

Jeśli dodałem inne pole do tabeli stron, które zawsze zawiera wartość "strona", którą mógłbym zrobić

Page->has_many(links => "Link", {"foreign.link_id" => "self.id", "foreign.link_table" => "self.what_table_am_i"});

ale to nie jest optymalne rozwiązanie.

Dzielenie tabeli linków na oddzielną dlakażdy typ może być możliwy, ale jest to istniejący projekt, który jest rozważany pod kątem adaptacji do DBIx :: Class, i mogą istnieć inne miejsca, w których podział tabeli na wiele innych tabel jest bardziej kłopotliwy, niż jest to warte.

Odpowiedzi:

3 dla odpowiedzi № 1

Powinieneś po prostu stworzyć metodę otoki, która wywołuje relację z wymaganymi argumentami:

Page->has_many(__all_links => "Link", "link_id");

sub links {
shift->__all_links({link_table => "page"});
}

Byłoby łatwo przekształcić się w komponent DBIx :: Class, jeśli masz wiele tabel, które muszą mieć taką logikę łączenia.


1 dla odpowiedzi nr 2

Można go określić w has_many call tak:

Page->has_many(links => "Link", "link_id",
{ where => { link_table => "page"} });

Widzieć: DBIx :: Class Cookbook