PHP をデータベース操作に使用する場合、多くの場合、1 対多の相関クエリを実行する必要があります。この種のクエリでは、1 つのテーブルのデータを別のテーブルの複数のデータに関連付けることができます。 PHP では、1 対多のリレーショナル クエリは通常 2 次元配列になります。この配列では、各要素がメイン テーブル レコードを表し、対応する値が複数の関連テーブルのレコードになります。
この記事では、PHP を使用して 1 対多の関連クエリを実行し、2 次元配列の結果を取得する方法を紹介します。
1. 1 対多のリレーショナル クエリとは何ですか?
データベースでは、2 つのテーブル間に主キーと外部キーの関係がある場合、1 対多の関連付けクエリを実行できます。この関係では、1 つのテーブルの 1 つのレコードが別のテーブルの複数のレコードに対応します。
たとえば、「生徒テーブル」と「得点テーブル」があり、「生徒テーブル」の各生徒は複数の「得点テーブル」のレコードに対応しています。この関係は、以下に示すように、主キーと外部キーを使用してバインドできます。
CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `score` ( `id` int(11) NOT NULL AUTO_INCREMENT, `student_id` int(11) DEFAULT NULL, `score` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `student_id` (`student_id`), CONSTRAINT `score_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
「Student Table」では、各レコードに一意の識別子 ID と名前 NAME が含まれます。 「スコア テーブル」では、各レコードには同じ一意の識別子 ID と、レコードがどの生徒に属しているかを表す対応する STUDENT_ID が含まれており、さらに、生徒のスコアを表す SCORE フィールドもあります。
2. 1 対多の相関クエリを実行するにはどうすればよいですか?
PHP では、JOIN キーワードを使用して 1 対多の関連クエリを実行できます。 JOIN は、2 つ以上のテーブルの同じ列を結合して大きなテーブルを生成するために使用される SQL のキーワードです。
上記の例で、student テーブルを成績テーブルに関連付ける場合は、次の SQL ステートメントを使用できます。
SELECT student.*, score.score FROM student LEFT JOIN score ON student.id = score.student_id;
このステートメントでは、最初に Student テーブルのすべてのフィールドを選択します。 table を作成し、LEFT JOIN および ON キーワードを使用してスコア テーブルと学生テーブルを接続します。接続の条件は、student テーブルの ID フィールドが成績テーブルの STUDENT_ID フィールドと等しいことです。最後に、SELECT ステートメントで表示する列を選択し、2 次元配列の結果を取得します。
PHP の PDO オブジェクトでは、クエリ メソッドを使用して上記の SQL ステートメントを実行し、fetchAll メソッドを使用して 2 次元配列の結果を取得できます。コードでは、最初に PDO オブジェクトを作成し、次に query メソッドを使用して SQL ステートメントを実行し、最後に fetchAll メソッドを使用して結果を取得します。
3. 1 対多の関連付けクエリ結果を 2 次元配列に処理するにはどうすればよいですか?
1 対多の関連付けクエリを実行する場合、複数のテーブルのデータを 2 次元配列の結果に結合する必要があります。この 2 次元配列の各要素はメイン テーブルのレコードを表し、対応する値は複数の関連テーブルのレコードになります。
以下は、1 対多の関連付けクエリ結果を 2 次元配列に処理する方法です:
$db = new PDO('mysql:host=localhost;dbname=mydb', 'myuser', 'mypassword'); $stmt = $db->query('SELECT student.*, score.score FROM student LEFT JOIN score ON student.id = score.student_id'); $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
上記のコードでは、まず空の配列 $data を作成します。 2 次元配列の最終的な結果として使用されます。次に、foreach ループを使用してクエリ結果の各レコードを走査し、各レコードの主キー ID を $id 変数に保存します。
次に、$data 配列に主キー $id を持つ要素が既に存在するかどうかを確認します。存在しない場合は、要素が $data 配列に挿入され、主キーに関連するすべてのレコードを保持するために「scores」という名前の空の配列が作成されます。すでに存在する場合は挿入する必要はなく、既存の要素が直接使用されます。
レコードを走査するときに、「スコア テーブル」内のレコードが見つかった場合は、そのレコードの SCORE フィールドをスコア配列に追加します。 1 つのメイン テーブル レコードは複数の関連テーブル レコードに対応するため、スコア配列は 2 次元配列として保存する必要があります。
ループが終了すると、最終的な 2 次元配列の結果が $data 配列に格納されます。各要素はメイン テーブル レコードを表し、対応する値は関連テーブル内の複数のレコードです。
4. 例
以下は、1 対多の関連付けクエリを実行し、結果を 2 次元配列に処理する方法を示す完全な例です。 ##上記の例では、まず PDO オブジェクトを作成し、クエリ メソッドを使用して SQL ステートメントを実行します。次に、fetchAll メソッドを使用してクエリ結果を取得します。
次に、foreach ループを使用してクエリ結果の各レコードを走査し、2 次元配列に処理します。最後に、print_r 関数を使用して結果を出力します。
5. 結論
この記事では、PHP で 1 対多の関連クエリを実行し、結果を 2 次元配列に処理する方法を紹介します。結果を処理するときは、ループを使用してクエリ結果を走査し、それらを 2 次元配列に変換する必要があります。すべてのレコードを処理した後、各要素がメイン テーブル レコードを表し、対応する値が複数の関連テーブルのレコードである 2 次元配列の結果を取得できます。
以上がPHP を使用して 1 対多の相関クエリを実行する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。