Tulis semula tajuk sebagai: Jika data sudah dimasukkan atau tidak dimasukkan ke dalam jadual A dalam MySQL, masukkan id daripada jadual A ke dalam jadual B
P粉716228245
P粉716228245 2023-09-11 19:14:37
0
1
549

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_ingredientsingredient_iddalam 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');
});

P粉716228245
P粉716228245

membalas semua(1)
P粉366946380

Untuk setiap bahan dalam resipi:

  • SELECT id FROM ingredients WHERE ingredient = ?
  • Jika pertanyaan di atas berjaya, tetapkan ingredient_id kepada id yang dikembalikan
  • Jika tidak berjaya, laksanakan MASUKKAN KE DALAM bahan (bahan) NILAI (?) dan tetapkan INSERT INTO ingredients (ingredient) VALUES (?),并将ingredient_id kepada ID kenaikan automatik yang ditetapkan
  • Gunakan nilai ingredient_id值进行INSERT INTO recipes yang terdapat dalam langkah di atas untuk MASUKKAN KE DALAM resipi
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]);
});
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan