Si j'ai bien lu votre code, ce que vous recherchez est une seule instruction MERGE que vous pouvez exécuter sur la base de données. Je ne connais pas PHP, donc je ne peux pas vous dire comment l'appeler, mais je peux vous donner l'instruction SQL à exécuter :
MERGE INTO mep_tbl_output_details tgt
USING (SELECT mtm.modelid,
mtm.model_name,
mtmc.configurationid,
mtmc.date_code,
mtmc.read_row_after,
mtmc.create_from_format,
mtmc.ip_address,
mtmc.status,
mtmc.ts_code
FROM mep_tbl_model mtm
INNER JOIN mep_tbl_model_configuration mtmc ON mtm.modelid = mtmc.modelid_fk
WHERE mtm.active = 'Y'
AND mtm.location = 'PCBA') src
ON (tgt.modelid_fk = src.modelid
AND tgt.ts_code = src.ts_code
AND tgt.configurationid_fk = src.configurationid
AND tgt.runningdate = :log_date
AND tgt.shift = 'Morning'
AND tgt.quantity_status = 'OK')
WHEN NOT MATCHED THEN
INSERT (tgt.modelid_fk, tgt.running_date, tgt.quantity_status, tgt.ts_code, tgt.shift, tgt.configuration_fk)
VALUES (src.modelid, :log_date, 'OK', src.ts_code, 'Morning', src.configurationid);
Cela fait la jointure que vous étiez en train de réinventer avec vos boucles, la relie à la table dans laquelle vous essayez d'insérer et n'insère une ligne que si elle n'existe pas déjà dans la table.
Vous auriez besoin d'écrire le code PHP pour l'exécuter, après avoir passé le log_date en tant que variable de liaison.
En liant la variable, vous permettez à la base de données d'ignorer l'analyse difficile (c'est-à-dire de trouver la meilleure façon d'exécuter la requête), ce qui fait gagner du temps.
En ne récupérant pas les données et en bouclant manuellement avant de sélectionner plus de données et de déterminer si vous devez faire l'insertion, vous évitez beaucoup de changements de contexte et de transfert/extraction de données sur le réseau. Laissez la base de données faire le gros du travail; c'est ce pour quoi il a été conçu !