developer.jelix.org is not used any more and exists only for history. Post new tickets on the Github account.
developer.jelix.org n'est plus utilisée, et existe uniquement pour son historique. Postez les nouveaux tickets sur le compte github.

Opened 8 years ago

Last modified 8 years ago

#1453 assigned enhancement

jDao : DELETE table1 query with join on table2

Reported by: lucky1er Owned by: lucky1er
Priority: normal Milestone:
Component: jelix:dao Version: 1.3.1
Severity: normal Keywords: jDao
Cc: Blocked By:
Blocking: Documentation needed: no
Hosting Provider: Php version: 5.2

Description

The objective is to generate a such jDAO query on a MySQL database (example) :

DELETE table1 FROM table1 LEFT JOIN table2 ON (table1.fk = table2.id) WHERE table1.critere = 1

AND table2.autre IS NULL

see: http://jelix.org/forums/forum/5-jelix-utilisation-et-developpement/posts/9690-9072-resolu-jdao-condition-sur-une-property-issue-d-une-optionalforeigntable

Attachments (1)

example.xml (959 bytes) - added by lucky1er 8 years ago.
This supports a definition xml for jDao that may look like the following (see the attached file) :

Download all attachments as: .zip

Change History (5)

comment:1 Changed 8 years ago by lucky1er

  • Owner set to laurent
  • Status changed from new to reviewing

Changed 8 years ago by lucky1er

This supports a definition xml for jDao that may look like the following (see the attached file) :

comment:2 Changed 8 years ago by laurentj

  • Status changed from reviewing to assigned

(recap de ce qui a été dit sur le pull request)

Cette solution a un problème.

Dans le cas où on a un critère uniquement sur la table principale, la requête devient

DELETE table1 FROM table1 LEFT JOIN table2 ON (table1.fk = table2.id)
WHERE table1.critere = 1

Au lieu de

DELETE table1 FROM table1 WHERE table1.critere = 1

Ce qui n'est pas tout à fait pareil. Et ce n'est pas du tout la même chose quand on a une jointure forte (donc <foreigntable>).

DELETE table1 FROM table1, table2 
WHERE table1.fk = table2.id AND  table1.critere = 1

N'est pas du tout équivalent à

DELETE table1 FROM table1 WHERE table1.critere = 1

Donc il va falloir différencier les cas où on a des critères sur une table étrangère, et les cas où il y en a pas.

Ensuite se pose la compatibilité avec les bases. Si c'est uniquement chez mysql, alors :

  • si on choisit une autre base, la DAO ne pourra pas fonctionner
  • il faudra de toute façon faire cette modif, non pas dans la jDaoGenerator, mais dans le générateur propre au driver (héritant de jDaoGenerator).

Je pense que cette incompatibilité est vraiment bloquante pour l'acceptation de cette nouvelle fonctionnalité. Il faut proposer une solution pour les autres types de bases. Peut être générer par défaut un DELETE FROM table1 WHERE table1.critere=... and table1.identifiant IN (SELECT identifiant FROM jointures... WHERE ... AND table2.critere=...). Faut vérifier si ça peut fonctionner et si les requêtes sont vraiment équivalentes. Et dans le driver Mysql, on génère la forme "special mysql".

Il faudrait des tests unitaires aussi.

comment:3 Changed 8 years ago by laurentj

  • Owner changed from laurent to lucky1er

comment:4 Changed 8 years ago by laurentj

Peut être générer par défaut un DELETE FROM table1 WHERE table1.critere=... and table1.identifiant IN (SELECT identifiant FROM jointures... WHERE ... AND table2.critere=...).

Seulement dans le cas bien sûr où on a des critères sur les tables étrangères.

Note: See TracTickets for help on using tickets.