2つのフォームを1つのidで紐付けても、一方のフォームでそのidの値が同じで重複する可能性もあります。
その場合、2つのテーブルを結びつける中間テーブルを作成して、紐付けidとは異なるこの識別子で具体的なテストセッションやグループを管理できます。
これによりどのテーブルが他のテーブルと関連づけられているかより明確になります。
MySQL
CREATE TABLE test_mappings (
mapping_id INT AUTO_INCREMENT PRIMARY KEY
);
ALTER TABLE tests
ADD COLUMN mapping_id INT,
ADD CONSTRAINT fk_tests_mapping_id FOREIGN KEY (mapping_id) REFERENCES test_mappings(mapping_id);
ALTER TABLE test_patterns
ADD COLUMN mapping_id INT,
ADD CONSTRAINT fk_test_patterns_mapping_id FOREIGN KEY (mapping_id) REFERENCES test_mappings(mapping_id);
同じidの値を複製する方のバックエンド処理
こちらでフォーム入力を行ったと同時に、自動的に中間テーブルのデータを生成する。
中間データのidはmapping_idとする。
<?php
try {
// 新しいmapping_idを生成
$conn->beginTransaction();
$conn->exec("INSERT INTO test_mappings () VALUES ()");
$mappingId = $conn->lastInsertId();
// test_questionsにデータを挿入
$sql = "INSERT INTO tests (id, mapping_id) VALUES (:id, :mapping_id)";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':id', $id, PDO::PARAM_STR);
$stmt->bindParam(':mapping_id', $mappingId, PDO::PARAM_INT);
$stmt->execute();
$conn->commit();
echo "大問が作成され、マッピングIDが割り当てられました。";
} catch (PDOException $e) {
$conn->rollBack();
echo "エラー: " . $e->getMessage();
}
$conn = null;
?>
もう一方のテーブルに中間テーブルのidを紐づけるバックエンド処理
<?php
// ここで、ユーザーは既存のmapping_idを選択する
$selectedMappingId = $_POST['mapping_id']; // ユーザーがフォームから送信したmapping_id
try {
// mapping_idのデータを挿入
$sql = "INSERT INTO test_patterns (id, mapping_id) VALUES (:id, :mapping_id)";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':id', $id, PDO::PARAM_STR);
$stmt->bindParam(':mapping_id', $selectedMappingId, PDO::PARAM_INT);
$stmt->execute();
echo "パターンが設定され、選択されたマッピングIDが使用されました。";
} catch (PDOException $e) {
echo "エラー: " . $e->getMessage();
}
$conn = null;
?>
これにより両方のデータを紐づけることができました。
2つのデータを結びつけて表示させます。
$stmt = $dbh->prepare("SELECT q.* FROM tests AS ts
INNER JOIN test_types AS t ON q.test_type_id = ts.id
LEFT JOIN test_mappings AS tm ON tm.mapping_id = q.mapping_id
WHERE t.id = ? AND q.mapping_id = ? LIMIT 2");
$stmt->execute([$test_id, $mapping_id]);
$data_lists = $stmt->fetchAll(PDO::FETCH_ASSOC);
<?php foreach $data_lists as $list ?>
<p><?php echo $list['data']; ?></p>
<?php endforeach; ?>