Quick links: Content - sections - sub sections
EN FR
Quick Search Advanced search
 
Page

  [Opened] Select imbriqué dans une factory

Posted by creusois on 09/01/2008 18:10

Bonjour,

Je suis dans un cas un peu complexe. Je cherche à savoir si je peux faire ca dans une factory ou si je dois obligatoirement déclarer une méthode php dans mon dao.

La situation est la suivante. J'ai deux tables : Pacelle Mere (id, champsParcelleMere, dateVersion, idVersion) Cadastre (id, champsCadastre, fkParcelleMere, dateVersion, idVersion)

c'est une simple clé etrangère sauf qu'il faut gérer la version. CAD que la clé etrangère ne référence pas l'id de la parcelle mère mais l'idVersion de la parcelle mère.

Donc lorsque j'affiche un cadastre il faut que j'aille chercher la parcelle mère dont la date est vide (car la dateVersion ne se rempli que quand un version est obselete) et dont l'idVersion est le même que la clef étrangère du cadastre.

Actuellement je fais ceci :

  $fact = jDao::get('propriete~cadastre');
  $cadastre = $fact->get($idCadastre);
  $idMere = $cadastre->idParcelleMere;
  $rep->body->assign("cadastre", $cadastre);
		
  unset($fact);

  $fact = jDao::get('propriete~parcelle_mere');
  $conditions = jDao::createConditions();
		  
  $conditions->addCondition('id_historique','=', $idMere);
  $conditions->addCondition('historique','=', "0000-00-00 00:00:00");
 
  $ParcelleMere = $fact->findBy($conditions);
  $tab = $ParcelleMere->fetchAll();
  $rep->body->assign('nomParcelleMere', $tab[0]);
  unset($fact);

Je cherche donc à tout imbriqué dans une seul et même methode de la factory.

En SQL cela revient aussi à faire ceci : SELECT idCadastre, section, nom FROM `cadastre` RIGHT JOIN parcelle_mere ON cadastre.idParcelleMere = parcelle_mere.id_historique ORDER BY parcelle_mere.idParcelleMere DESC LIMIT 1

Je peux encore à la rigueur accepter ceci, le problème réside dans l'affichage du listing complet des cadastres.

En effet si je veux afficher tous les cadastres sous forme de tableau, je suis obligé de faire une requette à chaque ligne pour aller chercher la bonne clé étrangère.

  [Opened] Re: Select imbriqué dans une factory

Reply #1 Posted by laurentj on 09/02/2008 08:09

Salut,

tout histoire est vraiment confuse. D'un coté tu parles d'une histoire de version, et de l'autre tu nous montres une requête qui travaille sur un champs historique. Donc difficile de comprendre ce que tu veux exactement.

Pour bien faire, il aurait fallu donner le schema sql de tes tables plutôt qu'une simple liste de nom de champs.

De plus

CAD que la clé etrangère ne référence pas l'id de la parcelle mère mais l'idVersion de la parcelle mère.

elle ne veut pas dire grand chose ta phrase, et je ne vois pas de rapport avec tes champs. Si la clé étrangère n'est pas fkParcelleMere, pourquoi elle s'appelle fkParcelleMere ? C'est quoi ta clé étrangère exactement ? Et c'est quoi la clé primaire sur parcellemere ? j'ai comme l'impression que cette clé primaire devrait comprendre l'id de la parcelle (non autoincremental) + idversion

En effet si je veux afficher tous les cadastres sous forme de tableau, je suis obligé de faire une requette à chaque ligne pour aller chercher la bonne clé étrangère.

mouai.. j'ai l'impression que ton schema est à revoir.

concernant ton code :

  • inutile de faire des unset
  • reserve l'usage de createConditions quand tu ne sais pas à l'avance le nombre de critères. Ici, tel que ton code est fait, il aurait été mieux d'en faire directement une méthode dans la factory. C'est plus efficace.

  [Opened] Re: Select imbriqué dans une factory

Reply #2 Posted by creusois on 09/03/2008 15:52

Bonjour,

Je vais donc tenter de mieux m'exprimer.

Les deux tables sont les suivantes :

 CREATE TABLE `parcelle_mere` (
  `idParcelleMere` int(11) NOT NULL auto_increment,
  `nom` varchar(50) NOT NULL,
  `historique` datetime NOT NULL default '0000-00-00 00:00:00',
  `id_historique` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`idParcelleMere`)
 ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

 CREATE TABLE `cadastre` (
  `idCadastre` int(11) NOT NULL auto_increment,
  `nom` varchar(50) NOT NULL,
  `idParcelleMere` int(11) NOT NULL,
  `historique` datetime default NULL,
  `id_historique` int(10) unsigned default NULL,
  PRIMARY KEY  (`idCadastre`),
  KEY `idParcelleMere` (`idParcelleMere`)
 ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

Dans le but d'effectuer un versionning de toutes les modifications (donc jamais de update, jamais de delete) j'utilise le mécanisme suivant.

Quand on modifie un enregistrement, je rempli le champs historique (date) de la date et l'heure du moment et je créais un nouvelle enregistrement contenant les modifications (ainsi que les non modification). Pour lister toutes les parcelles mere par exemple, je liste toutes les parcelles dont le champs historique n'est pas renseigné (donc ce sont des champs actuellement valide).

Le champs id_historique lui posséde l'id de la première version de mon enregistrement, c'est à dire que si des changement on lieu sur l'enretrement dont l'id est 1, toutes ses modifications seront dans des nouvelles entrées qui auront toutes dans l'id_historique 1.

Mon souci est que pour ma table cadastre, qui a une clé étrangère sur la table parcelle_mere, je ne peux pas faire une clé sur l'id des parcelles car celles-ci peuvent être obseléte à tout moment. Du coup je renseigne dans la clé étrangère de cadastre l'id_historique vers lequel il renvoit.

J'espere avoir été plus clair. Il me semble que c'est la solution classique pour géré des enregistrement web avec versionning.

Mon problème sous jelix est de sortir le bon référent parcelle_mere lorsque je liste les cadastres. Je sais le faire en SQL mais difficile de le faire via JELIX.

Pour lister tous les cadastres je cherche à remplir un tableau de ceci (pour chaque cadastre) cadastre.id_cadastre, cadastre.nom, (le nom et l'id parcelle mère dont l'id_historique == cadastre.idParcelleMere ET dont le champ historique n'est pas rempli)

De cette façon, lorsque je liste les cadastres, je suis sur que dans la clé étrangère j'ai bien la derniere version de la parcelle auquelle le cadastre fait référence.

  [Opened] Re: Select imbriqué dans une factory

Reply #3 Posted by creusois on 09/09/2008 12:43

Merci laurentj pour ces informations, je suis en train de les mettre en place.

J'ai tout de même une petite question simple, d'apres toi, pour des selects (en utilisant ta méthode avec deux tables). Dois-je passer par une factory de type PHP ou bien je peux faire les jointures sur les dates en XML (j'ai l'impression qu'on ne peut pas).

merci

 
Page
  1. Select imbriqué dans une factory