Saya telah mengekod selama kira-kira setahun sekarang dan saya sedang mengusahakan portfolio (laman web resipi) tetapi saya buntu dan tidak pasti bagaimana untuk meneruskan.
Masalah saya ialah saya perlu mencari cara untuk memasukkan id bahan penambahan automatik daripada jadual A (sama ada dimasukkan atau tidak) ke dalam jadual B.
Apabila resipi diserahkan, saya telah menyediakan kod yang menggunakan pertanyaan MySQL berikut untuk menyemak sama ada terdapat bahan yang diserahkan dalam jadual ramuan saya.
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
Saya pada mulanya cuba menggunakan pencetus selepas sisipan, tetapi menyedari bahawa pendekatan ini tidak akan berfungsi jika ramuan itu sudah wujud dalam pangkalan data dan bukan baru dimasukkan. Oleh itu, saya fikir pendekatan saya mungkin perlu difaktorkan semula.
Matlamat saya ialah, semasa menghantar resipi, untuk menyusun ramuan ke dalam tatasusunan, menggunakan kod berikut:
let ingredients = req.body.ingredients; let ingredientArray = Array(); ingredients.forEach(ingredient => { ingredientArray.push([ingredient.ingredient]); });
Kemudian jalankan pertanyaan MySQL dan masukkan ramuan ke dalam jadual A jika ia belum wujud, atau abaikan jika ia sudah wujud. Selepas dua pilihan ini, id penambahan automatik bahan akan dimasukkan ke dalam jadual B. Untuk menjadikan masalah lebih rumit, recipe_id akan diekstrak daripada jadual C (mengandungi pelbagai maklumat resipi lain), jumlah akan menjadi nilai yang ditaip oleh pengguna dalam medan input (ditukar kepada tatasusunan), unit_id akan menjadi yang dipilih oleh pengguna dan dipratentukan dalam pangkalan data Satu set unit sepadan dengan set unit ukuran yang telah ditetapkan (juga ditukar kepada tatasusunan). Kedua-dua tatasusunan ini akan dijadikan tatasusunan menggunakan kod JavaScript di atas.
Jadual A adalah seperti berikut:
id | Bahan-bahan |
---|---|
1 | Gula |
2 | tepung |
Jadual B adalah seperti berikut:
id | id_resepi | Jumlah | unit_id | id_bahan |
---|---|---|---|---|
1 | 45 | 1 | 5 | 1 |
2 | 76 | 4 | 4 | 2 |
Kaedah yang dikemas kini
Semoga ini adalah cara yang lebih baik, walau bagaimanapun, saya sedang bergelut untuk memikirkan cara membuat keputusan palsu pernyataan if saya dilaksanakan @checkIngredientFalse
,然后执行@checkIngredientTrue
方面遇到了困难,因为这将会将ingredient的id
添加到recipe_ingredients
的ingredient_id
dalam lajur jadual.
resipi.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'); });
Untuk setiap bahan dalam resipi:
SELECT id FROM ingredients WHERE ingredient = ?
ingredient_id
kepada id yang dikembalikanINSERT INTO ingredients (ingredient) VALUES (?)
,并将ingredient_id
kepada ID kenaikan automatik yang ditetapkaningredient_id
值进行INSERT INTO recipes
yang terdapat dalam langkah di atas untuk