Ich programmiere jetzt seit etwa einem Jahr und arbeite derzeit an einem Portfolio (einer Rezept-Website), aber ich stecke fest und weiß nicht, wie ich vorgehen soll.
Mein Problem ist, dass ich eine Möglichkeit finden muss, eine automatisch inkrementierende Zutaten-ID aus Tabelle A (ob eingefügt oder nicht) in Tabelle B einzufügen.
Wenn ein Rezept eingereicht wird, habe ich Code eingerichtet, der die folgende MySQL-Abfrage verwendet, um zu prüfen, ob meine Zutatentabelle eingereichte Zutaten enthält.
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
Ich habe zunächst versucht, einen Post-Insert-Trigger zu verwenden, habe aber festgestellt, dass dieser Ansatz nicht funktionieren würde, wenn die Zutat bereits in der Datenbank vorhanden ist und nicht neu eingefügt wird. Daher denke ich, dass mein Ansatz möglicherweise überarbeitet werden muss.
Mein Ziel ist es, beim Einreichen eines Rezepts die Zutat in einem Array zusammenzustellen, indem ich den folgenden Code verwende:
let ingredients = req.body.ingredients; let ingredientArray = Array(); ingredients.forEach(ingredient => { ingredientArray.push([ingredient.ingredient]); });
Führen Sie dann die MySQL-Abfrage aus und fügen Sie die Zutat in Tabelle A ein, falls sie noch nicht vorhanden ist, oder ignorieren Sie sie, wenn sie bereits vorhanden ist. Nach diesen beiden Optionen wird die automatisch inkrementierende ID der Zutat in Tabelle B eingefügt. Um das Problem noch komplizierter zu machen, wird „recipe_id“ aus Tabelle C (die verschiedene andere Rezeptinformationen enthält) extrahiert, „amount“ ist der vom Benutzer in das Eingabefeld eingegebene Wert (in ein Array konvertiert), „unit_id“ ist der vom Benutzer ausgewählte Wert Benutzerdefiniert und in der Datenbank vordefiniert. Ein Satz von Einheiten, der einem vordefinierten Satz von Maßeinheiten entspricht (ebenfalls in ein Array konvertiert). Diese beiden Arrays werden mithilfe des obigen JavaScript-Codes in Arrays umgewandelt.
Tabelle A lautet wie folgt:
id | Zutaten |
---|---|
1 | Zucker |
2 | Mehl |
Tabelle B lautet wie folgt:
id | recipe_id | Betrag | unit_id | Zutaten_ID |
---|---|---|---|---|
1 | 45 | 1 | 5 | 1 |
2 | 76 | 4 | 4 | 2 |
Aktualisierte Methode
Hoffentlich ist dies ein besserer Weg, aber ich habe Schwierigkeiten herauszufinden, wie ich das falsche Ergebnis meiner if-Anweisung in der Tabellenspalte ausführen kann. @checkIngredientFalse
,然后执行@checkIngredientTrue
方面遇到了困难,因为这将会将ingredient的id
添加到recipe_ingredients
的ingredient_id
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'); });
对于食谱中的每个成分:
SELECT id FROM ingredients WHERE ingredient = ?
ingredient_id
设置为返回的idINSERT INTO ingredients (ingredient) VALUES (?)
,并将ingredient_id
设置为分配的自增IDingredient_id
值进行INSERT INTO recipes