我現在已經編碼了大約一年了,目前我正在做一個作品集(一個食譜網站),但我陷入了困境,不確定該如何繼續。
我的問題是,我需要找到一種方法,將表A中的自動遞增的ingredient id(無論是否插入)插入到表B中。
提交食譜時,我已經設定了程式碼,它會使用以下MySQL查詢來檢查我的ingredients表中是否有提交的ingredient。
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
我最初嘗試使用插入後觸發器,但意識到如果ingredient已經存在於資料庫中並且不是新插入的,這種方法將不起作用。因此,我認為我的方法可能需要重構。
我的目標是,當提交食譜時,將ingredient編譯成一個數組,並使用以下程式碼:
let ingredients = req.body.ingredients; let ingredientArray = Array(); ingredients.forEach(ingredient => { ingredientArray.push([ingredient.ingredient]); });
然後執行MySQL查詢,如果ingredient尚未存在,則將其插入到表A中,如果已經存在,則忽略。在這兩個選項之後,ingredient的自動遞增id將會插入表B。為了讓問題更複雜,recipe_id將從表C中提取(包含其他各種食譜資訊),amount將是使用者在輸入欄位中鍵入的值(轉換為陣列),unit_id將是使用者選擇的與資料庫中預先定義的一組預先定義的測量單位相對應的單位(也轉換為數組)。這兩個陣列將使用上面的JavaScript程式碼使它們成為陣列。
表A如下:
id | 成分 |
---|---|
1 | 糖 |
2 | 麵粉 |
表B如下:
id | recipe_id | 金額 | unit_id | ingredient_id |
---|---|---|---|---|
1 | 45 | 1 | 5 | 1 |
2 | 76 | 4 | 4 | 2 |
更新的方法
#希望這是一個更好的方法,但是,我在弄清楚如何使我的if語句的false結果執行@checkIngredientFalse
,然後執行@checkIngredientTrue
方面遇到了困難,因為這會將ingredient的id
加入到recipe_ingredients
的ingredient_id
表格列中。
食譜.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'); });
P粉3669463802023-09-12 10:45:04
對於食譜中的每個食材:
SELECT id FROM ingredients WHERE ingredient = ?
ingredient_id
設定為傳回的idINSERT INTO ingredients (ingredient) VALUES (?)
,並將ingredient_id
設定為已指派的自增IDingredient_id
值進行INSERT INTO recipes
ingredients.forEach(async (ingredient) => { let ingredient_id; const [ing_ids] = await db.promise().query("SELECT id FROM ingredients WHERE ingredient = ?", [ingredient.toLowerCase()]); if (ing_ids.length > 0) { ingredient_id = ing_ids[0][0]; } else { const res = await db.promise().query("INSERT INTO ingredients (ingredient) VALUES (?)", [ingredient]); ingredient_id = res.insertId; } await db.promise().query("INSERT INTO recipeIngredients (recipe_id, ingredient_id) VALUES (?, ?)", [recipe_id, ingredient_id]); });