/ / Comment puis-je établir une relation DBIx :: Class avec une condition de jointure fixe? - perl, classe dbix

Comment puis-je établir une relation DBIx :: Class avec une condition de jointure fixe? - perl, classe dbix

Nous avons une table de liens capable de gérer plusieurs types d'objet d'un côté et je ne peux pas trouver comment obtenir l'un de ces objets dans la table de liens en utilisant has_many.

Exemple: la table de liens contient:

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

Construire la relation du côté des ressources est assez facile:

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

mais je n'ai pas pu obtenir la relation correspondante du côté de la page:

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

obtiendrait le lien not_page

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

donne une erreur "Invalid rel cond val page" (ce qui ne m'a pas surpris).

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

donne une erreur "Invalid rel cond val" ". Lancer des antislash n'a pas aidé.

DBIx :: Class :: Relationship :: Base dit:

La condition doit être un SQL :: Résumé-style représentation de la jointure entre les tables

et j'ai essayé différentes options à partir de là, telles que:

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

mais sans aucun succès.

Si j'ai ajouté un autre champ à la table des pages qui contient toujours la valeur "page", je pourrais le faire

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

mais ce n'est guère une solution optimale.

Fractionnement de la table de liens en un fichier séparé pourchaque type peut être une possibilité, mais il s'agit d'un projet existant que l'on envisage d'adapter à DBIx :: Class, et il peut y avoir d'autres endroits où diviser une table en plusieurs autres tables est plus compliqué que cela n'en vaut la peine.

Réponses:

3 pour la réponse № 1

Vous devez simplement créer une méthode wrapper qui appelle la relation avec les arguments requis:

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

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

Ce serait assez facile de devenir un composant DBIx :: Class si vous avez plusieurs tables qui doivent avoir ce type de logique de jointure.


1 pour la réponse № 2

Cela peut être spécifié dans l'appel has_many comme ceci:

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

Voir: DBIx :: Class Cookbook