CodeIgniter Active Record: 挿入、更新、削除クエリ

⚡ スマートサマリー

CodeIgniter Active Recordは、モデルがシンプルで安全なメソッドチェーンを使用してデータベースの読み書きを行えるようにするデザインパターンです。異なるデータベースエンジン間での挿入、選択、更新、削除をコードを書き直すことなくサポートし、入力値をパラメータ化することでSQLインジェクション攻撃を防ぎます。

  • 🔗 コアアイデア: Active Recordは、挿入、取得、更新、削除などのメソッド呼び出しでSQLをラップします。
  • 🛡️ セキュア: 値はパラメータとして渡されるため、SQLインジェクション攻撃から保護されます。
  • 🔄 ポータブル: 同じコードが MySQLSQL Server、その他データベースドライバを介して接続できます。
  • ⚙️ セットアップ: database.phpを設定し、データベースライブラリを自動ロードします。
  • ➕ インサート: $this->db->insert('table', $data) は INSERT を構築して実行します。
  • 🔍 選択: $this->db->get('table') はループ処理する行を返します。
  • 会<XNUMXxEXNUMX><XNUMXxXNUMXF>️️<XNUMXxXNUMXF>️️ 更新と削除: WHERE句にUPDATEまたはDELETE文を組み合わせると、行が変更または削除されます。

CodeIgniter Active Record CRUD

データはほとんどのアプリケーションの生命線です。データは分析して洞察を得たり、ビジネス上の意思決定を容易にしたりするために保存される必要があります。データは通常、データベースに保存されます。データベースとのやり取りにおいて主な懸念事項となるのは、セキュリティ、アクセスの容易さ、そしてデータベースベンダー固有の構造化照会言語(SQL)の実装です。

Active Recordは、データベースとのやり取りを安全かつ簡潔に行えるようにする設計パターンです。Active Recordには、次のような利点があります。

  • シンプルなメソッドチェーンを使用して、レコードの挿入、更新、削除を行います。
  • パラメータを使用してユーザー入力を安全に送信します。
  • 次のような複数のデータベース エンジンを操作できます。 MySQL アプリケーションコードを書き換えることなく、SQL Serverにも対応できます。
  • CodeIgniterは、バックグラウンドで各データベースエンジン専用のドライバを使用します。

Active Record の使い方: 例

このチュートリアルでは、注文と詳細の2つのテーブルを持つサンプルデータベースを使用します。このチュートリアルでは、 MySQL データベースがインストールされ、実行されています。以下のスクリプトを実行して、チュートリアル用データベースを作成してください。

CREATE SCHEMA ci_active_record;

USE ci_active_record;

CREATE TABLE `order_details` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`order_id` int(11) DEFAULT NULL,
`item` varchar(245) DEFAULT NULL,
`quantity` int(11) DEFAULT '0',
`price` decimal(10,2) DEFAULT '0.00',
`sub_total` decimal(10,2) DEFAULT '0.00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT = 1;

CREATE TABLE `orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` timestamp NULL DEFAULT NULL,
`customer_name` varchar(245) DEFAULT NULL,
`customer_address` varchar(245) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT = 1;

上記のコードは、ci_active_record という名前のデータベースと、orders および order_details という 2 つのテーブルを作成します。2 つのテーブル間の関係は、orders テーブルの id 列と order_details テーブルの order_id 列によって定義されます。

CodeIgniterデータベース構成

次に、アプリケーションがこのデータベースと通信するように設定を行います。application/config/database.phpにあるデータベース設定ファイルを開き、以下の行を探してください。

'hostname' => 'localhost',
'username' => '',
'password' => '',
'database' => '',

上記のコードを以下のように更新してください。

'hostname' => 'localhost',
'username' => 'root',
'password' => 'letmein',
'database' => 'ci_active_record',

注意: ユーザー名とパスワードを、ご自身のものに置き換える必要があります MySQL 構成。

データベース構成の詳細に加えて、 CodeIgniterがデータベースライブラリをロードする際に、データベースライブラリもロードするようにします。

ステップ1) 以下のファイルを開いてください:application/config/autoload.php。

ステップ2) $autoload配列のキーライブラリを見つけて、以下に示すようにデータベースライブラリをロードします。

$autoload['libraries'] = array('database');

ここに:

  • 上記のコードは、アプリケーション起動時にデータベースライブラリをロードします。

CodeIgniter アクティブレコードを挿入

テスト目的で、コントローラーを作成し、Active Record を介してアプリケーションとやり取りするためのルートを定義します。新しいファイル application/controllers/ActiveRecordController.php を作成し、次のコードを追加してください。

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class ActiveRecordController extends CI_Controller {
public function store_order(){
$data = [
'date' => '2018-12-19',
'customer_name' => 'Joe Thomas',
'customer_address' => 'US'
];

$this->db->insert('orders', $data);

echo 'order has successfully been created';
}
}

ここに:

  • $data = […] は、データベーステーブルの列名を配列キーとして使用し、それらに値を割り当てる配列変数 data を定義します。
  • `$this->db->insert('orders', $data);` は、データベースライブラリの挿入メソッドを呼び出し、テーブル名 `orders` と配列変数 `$data` を渡します。この行は、配列キーをフィールド名として、配列値を挿入する値として使用して、SQL INSERT ステートメントを生成します。

コントローラーメソッドを作成したので、次にそれを実行するルートを作成する必要があります。application/config/routes.phpを開き、次の行を追加してください。

$route['ar/insert'] = 'activerecordcontroller/store_order';

ここに:

  • ActiveRecordControllerのstore_orderメソッドを呼び出すar/insertというルートを定義します。

それでは、Webサーバーを起動して、私たちの方法をテストしてみましょう。以下のコマンドを実行して、組み込みのPHPサーバーを起動してください。

cd C:\Sites\ci-app
php -S localhost:3000

ここに:

  • 上記のコマンドは、プロジェクトディレクトリに移動し、ポート3000で組み込みサーバーを起動します。

以下を読み込んでください URL ブラウザに以下を入力してください: http://localhost:3000/ar/insert。 次の結果が得られます。

order has successfully been created

Video Cloud Studioで MySQL チュートリアルデータベースを開き、ordersテーブルを確認してください。下の画像に示すように、新しく作成された行が表示されます。

アクティブレコードを介して新しい注文行が挿入されました

CodeIgniter アクティブレコードを選択

このセクションでは、データベース内のレコードを読み込み、Webブラウザに順不同リストとして表示する方法を見ていきます。ActiveRecordControllerに次のメソッドを追加してください。

public function index() {
$query = $this->db->get('orders');

echo "<h3>Orders Listing</h3>";
echo "<ul>";

foreach ($query->result() as $row) {
echo "<li>$row->customer_name</li>";
}

echo "</ul>";
}

ここに:

  • $query = $this->db->get('orders'); は、orders テーブルに対して SELECT クエリを実行し、すべてのフィールドを選択します。
  • echo “注文一覧”; HTMLの見出しを表示します。
  • echo “ ”; は、順不同の HTML リストの開始タグを出力します。
  • foreach ($query->result() as $row) {…} はデータベースから返された結果をループ処理し、echo “ $row->customer_name ”; customer_name を出力します。

ロードする前に URLすると、データベースにレコードをさらにいくつか追加できます。それでは、SELECTクエリのルートを定義しましょう。application/config/routes.phpを開き、次のルートを追加してください。

$route['ar'] = 'activerecordcontroller';

ここに:

  • ルート ar は、ActiveRecordController クラスの index メソッドを指しています。これはデフォルト設定であるため、レコードを挿入するルートの場合とは異なり、index メソッドを指定していません。

ウェブサーバーが既に起動していると仮定して、以下を読み込みます。 URL: http://localhost:3000/arウェブブラウザには、以下のような結果が表示されるはずです。

Active Record経由で選択された注文リスト

CodeIgniterアップデートのアクティブレコード

このセクションでは、Active Record を使用してデータベースを更新する方法について説明します。たとえば、顧客名を Joe Thomas から Joe に更新したいとします。ActiveRecordController クラスに次のメソッドを追加します。

public function update_order() {
$data = [
'customer_name' => 'Joe',
];
$this->db->where('id', 1);
$this->db->update('orders', $data);
echo 'order has successfully been updated';
}

ここに:

  • $data = […] は、データベース テーブルで更新したいフィールドと値を定義します。
  • $this->db->where('id', 1); は更新クエリの where 句を設定します。
  • $this->db->update('orders', $data); SQL 更新クエリを生成し、データベースに対して実行します。

上記のコードは、以下のSQL文を生成します。

UPDATE orders SET customer_name = 'Joe' WHERE id = 1;

それでは、application/config/routes.php を更新して、以下のルートを追加しましょう。

$route['ar/update'] = 'activerecordcontroller/update_order';

変更を保存して、以下を読み込んでください。 URL ウェブブラウザで:

注文が正常に更新されました メッセージ

それでは、データベースのレコードを表示して、変更が反映されているかどうかを確認してみましょう。

更新された名前を表示する注文リスト

上の画像からわかるように、最初のレコードはJoe ThomasからJoeに更新されました。

CodeIgniter アクティブレコードの削除

これからデータベースからレコードを削除します。IDが3のレコードを削除します。ActiveRecordControllerに以下のメソッドを追加してください。

public function delete_order() {
$this->db->where('id', 3);
$this->db->delete('orders');

echo 'order has successfully been deleted';
}

ここに:

  • $this->db->where('id', 3); は where 句を設定します。
  • $this->db->delete('orders'); は、where句で設定された条件に基づいて、ordersテーブルのデータベース行を削除します。

上記のコードを実行するには、以下を読み込んでください。 URL ウェブブラウザで: http://localhost:3000/ar/delete.

よくあるご質問

Active Record は値を SQL 文字列に連結するのではなくパラメーターとしてバインドするため、ユーザー入力によってクエリ構造を変更することはできません。ping 挿入、更新、およびWHERE句では自動的に実行されます。

はい。Active Record はエンジンごとにドライバを介して SQL を生成するため、 MySQL SQL Serverへの移行は、ベンダー固有のSQLを避ければ、通常はモデルコードではなく構成の変更を意味します。

WHERE句は、ステートメントが影響を与える行を制限します。WHERE句がない場合、更新または削除はテーブル内のすべての行に対して実行され、これはよくある、そしてコストのかかるミスです。

はい。AIはSELECT、INSERT、UPDATE、DELETEを同等のget、insert、update、deleteチェーンに書き換えることができます。複雑な結合には単純なActive Recordではなくクエリビルダーが必要になる場合があるため、結果をテストしてください。

データベースライブラリを自動ロードすることで、$this->db を毎回ロードすることなく、すべてのコントローラとモデルで使用できるようになります。アプリケーションの大部分がデータベースと通信する場合に便利です。