PHP+MySQL - 2 tables + 1 tb liaison , comment on add/update?

Eléphant du PHP | 168 Messages

12 févr. 2013, 01:58

Bonjour,

Je viens pour un problème qui sera surement une formalité pour quelqu'un qui est habitué à manipuler les tables n,m.

J'ai 3 tables :

- Une table LANGUES
CREATE TABLE IF NOT EXISTS `langues` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  `iso` varchar(2) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `langues_iso_index` (`iso`)
)
- Une table CATEGORIES
CREATE TABLE IF NOT EXISTS `categories` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `status` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
)
Et la table de liaison
CREATE TABLE IF NOT EXISTS `category_langue` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `description` varchar(100) NOT NULL,
  `slug` varchar(100) NOT NULL,
  `image` varchar(255) NOT NULL,
  `langue_id` int(10) unsigned NOT NULL,
  `category_id` int(10) unsigned NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
)
Je sèche lamentablement pour ajouter ou modifier une langue/noms des catégories, je n'arrive pas à comprendre comment mettre en place mes requêtes et mes formulaires pour gérer ses colonnes depuis mon admin.
J'avais commencé à afficher ce genre de vue pour la seule langue dont j'avais ajouté les valeurs à la main directement dans PHPMYADMIN.
Image
Mais la théorie n'a pas été suivi par la pratique, quand j'ai voulu faire la même requête pour l'anglais par exemple, j'ai eu un retour de ma requête "null" (logique car j'ai aucunes données dans la table de liaison pour cette langue), ce qui m'a bloqué dans ma lancée et je ne vois pas comment je peux renseigner des champs qui n'existent pas encore.
Je pense donc prendre le problème de la mauvaise manière...

Pareil pour l'édition, j'arrive bien à afficher mes champs FR, mais comment faire pour l'update, je ne vais tout de même pas nommer chaque champ input name="1_2" (1 pour l'id de la cat et 2 pour la langue, etc.. pour chaque input ? cela me semble du bidouillage.

En espérant avoir été clair, il y a beaucoup de questions, car il y a beaucoup de points à m'éclaircir dans mon esprit, j'espère qu'une ame charitable pourra m'aider... merci d'avance...

Mammouth du PHP | 881 Messages

12 févr. 2013, 04:15

Bonjour,

avant de bâtir tes requêtes en MySQL, il faudrait que tu te les bâtisses clairement pour toi-même. Quels sont les champs qui lient les tables d'une à l'autre? Quelle table sera liée aux deux autres (il n'est pas nécessaire que les trois tables aient des liens avec chacune des deux autres, mais qu'une des trois ait deux liens), ce sera la table pivot.

Peut-être peux-tu nous montrer la première requête et nous comprendrons mieux.

Si je comprends ton intention, tu veux lier une catégorie à une langue par l'intermédiaire de la table catégorie_langue.
Si tel est le cas, il serait plus facile et sûr de traiter à travers les id de chaque table. Pour cela, je te propose d'ajouter deux champs dans ta table liaison:
id_langue
id_catégorie

Ensuite il sera facile de lier tout cela de façon sûre et stable (car ça ne dépendra pas de typographie ou de casse).
Ainsi, tu pourrais bâtir une requête du genre:
SELECT MIX.*, LNG.iso, CATEG.status
FROM category_langue AS MIX
JOIN langues AS LNG ON LNG.id = MIX.id_langue
JOIN categories AS CATEG ON CATEG.id = MIX.id_categ
WHERE (tes conditions de recherche)
Soyez artisans de paix

Eléphant du PHP | 168 Messages

12 févr. 2013, 13:17

Merci de ta réponse, mais effectivement je n'ai pas du être assez clair..
La requête que tu m'affiches sert effectivement à afficher le contenu de la table liaison avec les 2 autres tables en lien pour les relations. (C'est également la requête que j'ai sur mon image).

Donc de ce coté là, je n'ai pas de soucis. Le mien (de problème) se trouve pour l'ajout et la modification d'une nouvelle liaison, si je prends un autre exemple avec 2+1 table.

Par exemple des votes sur une vidéo, on se retrouve aussi avec une table videos, une table user et une table liaison video_vote, il est simple dans cet exemple de rajouter un vote à tel video de tel user, car c'est une seule ligne que l'on ajoute a la table liaison. Et on édite pas un vote, on le supprime éventuellement.

Dans mon exemple actuel, une catégorie est disponible en plusieurs langues, j'ai la difficulté de l'ajout d'une langue, car je n'ai plus une seule ligne a rajouter mais autant qu'il y a de catégories dans une langue déjà traduite (vous suivez ?) (Donc si j'avais 8 catégories en Français, je dois générer 8 champs pour l'anglais par exemple, et que chaque champ soit bien affecté à chaque catégorie différente).

Et je dois aussi pouvoir éditer dans un formulaire tous les mots pour chaque langue, je me retrouve donc à devoir afficher des champs pour des langues différentes et des catégories différentes mais dans un même formulaire, ca me semble le boxon (dans ma tête et sur mon formulaire).

Alors en résumé, je n'ai pas dans un premier temps le besoin d'une requête tout faite mais plutôt que l'on éclaircisse sur la logique que je dois appliquer pour mon cas :-) (Et je n'ai peut être pas utiliser la bonne approche)

Merci d'avance.

Mammouth du PHP | 881 Messages

12 févr. 2013, 15:26

Si je comprends bien votre problème, la solution résiderait tout simplement dans une nouvelle structure, une nouvelle organisation des données. Si vous êtes au début de votre projet et rencontrez déjà des problèmes d'inscription / extraction de données, c'est que la structure n'est pas adapatée. Faites vite de repenser tout cela. Le plus simple est d'exploser le plus possible votre structure en petites tables particulaires. Ce sera plus souple lors de la création de futures requêtes (encore imprévisibes en début de projet).
Soyez artisans de paix