Operation crud sur table intermedière

Soit cette base de donnée; comment arrivez vous à faire des opérations crud sur la table employe_mission?

Impossible de le générer ni avec le génération gii ni avec le lignes d commande shell.

merci pour votre aide

Salut Fouss,

hélas les clef composites ne sont pas gérées par le CRUD … donc faut y aller à la main.

Hmmm! C’est donc possible à la main? Comment faire?

…Et bien admettons que tu aies plusieurs colonnes dans ta table employee_misson (parce que sinon, en l’état, il n’y pas d’interêt à faire un crud). Ce que je ferai c’est de momentanément changer la table, et ne lui donner qu’une seule clef primaire.

Ensuite je lance le CRUD qui me genère toutes les classes nécessaires et enfin je restaure la structure d’origine (avec la clef composite). J’ai mes vues, mon contrôleur, mon modèle … et c’est maintenant que commence le travail "à la main". Et oui, parce que bien sûr il faut repasser tout le code généré et le modifier pour qu’il fonctionne avec la clef (idemployee,idmission).

Ok, c’est peut-être un peu primitif ;) … mais je ne vois pas comment faire autrement.

8)

Je veux comprendre. j’ai [color="#FF0000"]idemploye [/color]et [color="#FF0000"]idmission[/color]; n’est ce pas déjà plusieurs colonnes?

merci de m’éclaircir…

oui, tu as raison, mais bon, pour moi le GRUD généré par Gii m’aide en particulier pour créer les formulaires dans le cas où j’ai un grand nombre de colonnes dans ma table. Idem pour les modèles. C’est pour cela que dans le cas d’une table simple comme la tienne, et qui ne sert qu’à établier la lisaison MANY_MANY entre employee et mission, je ne suis pas sûr qu’un CRUD sur cette table soit utile.

Si par exemple la table employee_misson avait une colonne date (date à laquelle une mission a été attributée à un employé), assigner (nom de la personne ayant assigné la mission à l’employé),status ('état d’avancement de la mission pour un employé donnée), etc … dans ce cas, un petit coup de Gii et hop, tu as ton modèle, tes vues, ton controleur …après vient le travail d’adaptation à une clef composite. Mais si la table reste tout simple, alors il n’y a pas vraiment besoin d’utiliser Gii, toutes les opérations peuvent se faire depuis la vue employee ou mission.

J’espère avoir été un peu plus clair…

Merci Raoul

Tout ce que tu me dis m’aide beacoups à comprendre Yii.

Je fais l’état des choses: j’ai mes models employe, mission et employe_mission.

J’ai aussi générer les crud pour employe et mission.

Maintenant si je comprends je vais mettre les données de la table employe_mission en étant dans les vues employe ou mission.

Maintenant comment est ce que à partir de ces vues générer par Yii on peut mettre ou enlever des données dans la table employe_misson?

Je suis un peu embetant mais il me faut cela pour mieux comprendre le ce framework.

Merci une fois de plus

pas de souci, tu n’es pas embêtant… et je ne suis pas expert, on fait juste ce qu’on peut ;)

Arbitrairement je vais supposer que l’assignation d’une mission à un employé se fait depuis la vue ‘mission’ (mais on pourrait faire l’inverse ou même les deux).

[size=“4”]1.l’affichage de la mission. [/size]

Une mission est composée d’attributs spécifiques (son nom, sa description,etc…) et d’une liste d’employées qui lui sont assignés (la liste peut être vide)

Modifier :

protected/controllers/MissionController.php - methode : [i]actionShow/i - la requête doit retourner la mission, ainsi que tous les employés qui lui sont assignés. Pour cela, tu peux utiliser les ‘relations’ crées automatiquement par Gii. Dans le modèle Mission, la méthode Relations() devrait dans ton cas être :




	public function relations()

	{

		return array(

			'employe_mission' => array(self::HAS_MANY, 'EmployeMission', 'idemploye'),

			'employees' => array(self::MANY_MANY, 'Employe', 'employe_mission(idemploye,idmission)'),


		);

	}

protected/views/mission/show.php - tu peux donc utiliser la relation ‘employees’ pour récupérer tous les employés assignés à une mission

Je vais pas plus dans le détail car c’est un très vaste sujet.

[size="4"]2. création de la mission.[/size]

Là on change rien. On va établir comme régle qu’il n’est pas possible de créer une mission et de lui assigner des employées en une seule opération, il faudra faire ça en deux fois 1) créer la mission 2) assigner à un employé (ça simplifie)

[size="4"]3. assignation à un employé[/size]

Tu peux par exemple rajouter un lien ‘[color="#0000FF"]assigner à un employé[/color]’ dans le formulaire.

Modifier : protected/views/mission/show.php (attention, le lien ne doit apparaître qu’en mode ‘update’, et pas en mode ‘create’. Par exemple :




<?php if( $update ):?>

	<?php echo CHtml::link('assigner à un employé',array('assign')); ?>

<?php endif; ?>

A partir de là, on n’est plus dans la modification, mais bien dans la création ‘à la main’. Il faut donc créer la vue protected/views/mission/assign.php qui contiendra le formulaire d’assignation. Celui-ci peut être très simple et proposer par exemple une liste de tous les employées qui ne sont pas déjà assignés à cette tâche. Pour traiter ce formulaire, il faut enfin rajouter une action dans le controleur MissionController.

Bon, je te passe les détails du code et j’espère que ça t’aura aidé. En fait, la mise en place dépend de ce que tu souhaites afficher à l’utilisateur et du mode opératoire que tu veux proposer.Dans mon exemple j’ai pris quelques décisions afin de pouvoir illustrer le principe général…

Courage

8)

ps: le code contient peut-être des erreurs vu que je l’ai écrit de tête sans pouvoir le tester …

Je vais lire tout cela tranquillement et te faire un compte rendu

thanks!

Bonjour,

après de longues recherches voila ce que j’ai fais dans MissionController.php

et ma vue show.php contient

Cela m’affiche la liste des employés ayant participé à une mission de cette manière

Ce qui est logiquement bien mais j voudrais affiche cela avec un CGridView mais cmment faire?

Voila pour le 1er point où j’en suis pour le reste je creuse toujrs la tête (ça viendra peut être :D)