2010-07-20 6 views
0

Mon schéma ressemble à quelque chose comme ceci:many-to-one attribue à Storm

CREATE TABLE plans (
    id SERIAL PRIMARY KEY, 
    description text 
); 

CREATE TABLE projects (
    id SERIAL PRIMARY KEY, 
    project_id character varying(240) UNIQUE, 
    plan_id integer REFERENCES plans(id) ON DELETE CASCADE 
); 

Et je veux faire des requêtes de tempête le long des lignes de

plan = store.find(Plan, Plan.project_id == "alpha") 
# should translate to something like 
# SELECT p.* from plans p LEFT JOIN projects proj ON p.id = proj.plan_id 
#  WHERE proj.project_id = 'alpha'; 

(Notez que projects.plan_id n'est pas unique .)

Comment puis-je configurer ceci?

Répondre

2

Pour le SQL donné, il n'y a pas beaucoup de raison d'utiliser une jointure à gauche, puisque votre clause where ne correspondra à aucune ligne où il n'y a pas de projet correspondant. Vous pourriez obtenir les résultats avec:

result = store.find(Plan, Plan.id == Project.plan_id, Project.project_id == "alpha") 

Cela vous donnera un objet ResultSet. Compte tenu de votre schéma, il semble que vous vous attendez à une seule rangée, de sorte que vous pouvez accéder à ce avec:

plan = result.one() 

Ou les attacher à la fois avec:

plan = store.find(Plan, Plan.id == Project.plan_id, Project.project_id == "alpha").one() 

Si vous avez vraiment besoin de faire un jointure gauche, la syntaxe pour cela serait quelque chose comme ceci:

result = store.using(LeftJoin(Plan, Project, Plan.id == Project.plan_id)).find(
    Plan, Project.project_id == "alpha") 
+0

Ça a l'air bien. Je suppose que je m'attendais à pouvoir définir la relation Plan.id == Project.plan_id dans un attribut de Plan, et pas explicitement dans l'expression de recherche, mais cela fonctionne. – keturn

+0

Eh bien, en fonction de la façon dont vous structurez votre code, l'ajout de propriétés Reference ou ReferenceSet à vos classes pourrait mieux répondre à vos besoins. Par exemple, si vous avez déjà récupéré la ligne correspondante du projet, vous pouvez accéder au plan en tant que "project.plan" si vous avez défini une référence sur la classe Project comme suit: plan = Reference (plan_id, Plan.id) Mais si je commençais avec le nom du projet et que je voulais le plan directement, alors l'instruction unique find() entraînerait moins de requêtes. –

Questions connexes