Je code depuis environ un an maintenant et je travaille actuellement sur un portfolio (un site de recettes) mais je suis bloqué et je ne sais pas comment procéder.
Mon problème est que je dois trouver un moyen d'insérer un identifiant d'ingrédient auto-incrémenté du tableau A (qu'il soit inséré ou non) dans le tableau B.
Lorsqu'une recette est soumise, j'ai configuré un code qui utilise la requête MySQL suivante pour vérifier s'il y a des ingrédients soumis dans ma table d'ingrédients.
SELECT i.ingredient CASE WHEN LOWER(?) = LOWER(ingredient) THEN INSERT IGNORE INTO i (ingredient) VALUES ? ELSE LOWER(?) != LOWER(ingredient) THEN INSERT INTO i VALUES ? END FROM ingredients i
J'ai d'abord essayé d'utiliser un déclencheur post-insertion, mais j'ai réalisé que cette approche ne fonctionnerait pas si l'ingrédient existe déjà dans la base de données et n'est pas nouvellement inséré. Par conséquent, je pense que mon approche devra peut-être être remaniée.
Mon objectif est, lors de la soumission d'une recette, de compiler l'ingrédient dans un tableau, en utilisant le code suivant :
let ingredients = req.body.ingredients; let ingredientArray = Array(); ingredients.forEach(ingredient => { ingredientArray.push([ingredient.ingredient]); });
Ensuite, exécutez la requête MySQL et insérez l'ingrédient dans le tableau A s'il n'existe pas déjà, ou ignorez-le s'il existe déjà. Après ces deux options, l'identifiant auto-incrémenté de l'ingrédient sera inséré dans le tableau B. Pour compliquer le problème, recette_id sera extrait de la table C (contenant diverses autres informations sur la recette), montant sera la valeur saisie par l'utilisateur dans le champ de saisie (convertie en tableau), unit_id sera celle sélectionnée par le utilisateur et prédéfini dans la base de données Un ensemble d'unités correspondant à un ensemble prédéfini d'unités de mesure (également converties en tableau). Ces deux tableaux seront transformés en tableaux en utilisant le code JavaScript ci-dessus.
Le Tableau A est le suivant :
id | Ingrédients |
---|---|
1 | Sucre |
2 | farine |
Le tableau B est le suivant :
id | recipe_id | Montant | id_unité | ingredient_id |
---|---|---|---|---|
1 | 45 | 1 | 5 | 1 |
2 | 76 | 4 | 4 | 2 |
Méthode mise à jour
J'espère que c'est une meilleure façon, cependant, j'ai du mal à comprendre comment exécuter le faux résultat de mon instruction if @checkIngredientFalse
,然后执行@checkIngredientTrue
方面遇到了困难,因为这将会将ingredient的id
添加到recipe_ingredients
的ingredient_id
dans la colonne du tableau.
recette.js
async function createRecipeIngredient(newRecipeId, ingredientName, unitId, amount) { let ingredients = req.body.ingredients; let ingredientArray = Array(); ingredients.forEach(ingredient => { ingredientArray.push([ingredient.ingredient]); }); const ingredientQuery = ` SET @checkIngredient = (SELECT i.id FROM ingredients i WHERE i.ingredient = LOWER(?) ); SET @newRecipeId = (SELECT max(r.id) FROM recipes r ); SET @checkIngredientTrue = (INSERT INTO recipeIngredients (recipe_id, ingredient_id) VALUES (@newRecipeId, @checkIngredient) ); SET @checkIngredientFalse = (INSERT INTO ingredients (ingredient) VALUES (LOWER(?)) //MISSING CODE HERE// ); IF(@checkIngredient, @checkIngredientTrue, @checkIngredientFalse);` const [_queryRows, _queryFields] = await db.promise().query(ingredientQuery, [newRecipeId, _ingredientName, _unitId, _amount]); module.exports = { getRecipe, getRecipeComments, getRecipePhotos, getUserRecipeCommentLikes, createRecipe, insertRecipePhoto, createRecipeIngredient };
routerRecipes.js
router.post('/recipes/new', cloudinary.upload.single('photo'), async (req, res, _next) => { await recipeQueries.createRecipe(); await recipeQueries.insertRecipePhoto(newRecipeId, req.user, req.file.path); await recipeQueries.createRecipeIngredient(newRecipeId); res.redirect('/recipes'); });
Pour chaque ingrédient de la recette :
SELECT id FROM ingredients WHERE ingredient = ?
ingredient_id
sur l'identifiant renvoyéINSERT INTO ingrédients (ingrédient) VALUES (?)
et définissezINSERT INTO ingredients (ingredient) VALUES (?)
,并将ingredient_id
sur l'ID d'incrémentation automatique attribuéingredient_id
值进行INSERT INTO recipes
trouvée dans les étapes ci-dessus pour les recettesINSERT INTO