CodeIgniterのコントローラでモデルを呼び出す方法を徹底解説!初心者向け完全ガイド
生徒
「CodeIgniterを使っているのですが、コントローラからデータベースのデータを操作するにはどうすればいいですか?」
先生
「それには『モデル』という部品を呼び出す必要があります。コントローラは指揮者のような役割で、モデルに指示を出すんですよ。」
生徒
「モデルを呼び出す具体的な書き方を教えてほしいです!」
先生
「プログラミングが初めてでも大丈夫です。一緒に基本の形をマスターしていきましょう!」
1. コントローラとモデルの関係を知ろう
CodeIgniter(コードイグナイター)という便利な道具箱を使ってWebサイトを作る際、大切な考え方に「役割分担」があります。これを専門用語でMVC(エムブイシー)と呼びます。まずは、それぞれの役割を身近なものに例えて説明しますね。
例えば、あなたがレストランに行ったと想像してください。コントローラは「注文を受ける店員さん」です。お客さんの要望を聞いて、誰に何を頼むか判断します。そしてモデルは「材料を管理する倉庫番」です。冷蔵庫からお肉や野菜を取り出す、つまりデータベースという情報の保管場所からデータを持ってくる役割を持っています。
Webサイトで「ブログの記事一覧を見たい!」というリクエスト(注文)が来たとき、店員さんであるコントローラが、倉庫番であるモデルに「記事のデータを取ってきて!」と頼みます。この「頼む作業」が、今回学習するモデルの呼び出しです。プログラミング未経験の方でも、この「役割分担」さえイメージできれば、コードの意味がスッと理解できるようになりますよ。
2. モデルを作成する(準備運動)
コントローラから呼び出すためには、まず呼び出される対象である「モデル」が存在していなければなりません。モデルは、データベースとのやり取りを専門に行うプログラムです。ここでは、ユーザーの情報を扱う「UserModel(ユーザーモデル)」という名前のファイルを作ってみましょう。
モデルを作る場所は、決まったフォルダ(app/Models)の中です。そこに新しいファイルを作り、以下のようなコードを書きます。クラス名はファイル名と同じにするのがルールです。難しい言葉が出てきましたが、クラスとは「プログラムの設計図」のようなものだと考えてください。
namespace App\Models;
use CodeIgniter\Model;
class UserModel extends Model
{
// 使うテーブルの名前を指定します
protected $table = 'users';
// ユーザーの名前を返す簡単な機能を作ります
public function getUserName()
{
return "たろう";
}
}
このコードでは、「ユーザーの名前は『たろう』ですよ」と教える機能(メソッド)を作りました。returnというのは「結果を返す」という意味です。これで準備は完了です。
3. コントローラからモデルを呼び出す基本手順
いよいよ本題の、コントローラからモデルを呼び出す方法です。CodeIgniterでは、newというキーワードを使ってモデルを使える状態にします。これを「インスタンス化」と言いますが、今は「モデルという道具を使えるように箱から出す」というイメージで大丈夫です。
コントローラの中でモデルを呼び出す際は、まずそのモデルがどこにあるかを宣言し、その後に中身を動かします。パソコンを触ったことがない方でも、スマホでアプリを起動して操作する流れを想像してみてください。アプリを選ぶ(宣言する)→起動して使う(呼び出す)というステップと同じです。
namespace App\Controllers;
// 使うモデルの場所を教えます
use App\Models\UserModel;
class UserController extends BaseController
{
public function index()
{
// 1. モデルを使える状態にする(インスタンス化)
$userModel = new UserModel();
// 2. モデルの中にある機能(メソッド)を実行する
$name = $userModel->getUserName();
// 画面に表示してみる
echo "こんにちは、" . $name . "さん!";
}
}
実行結果は以下のようになります。
こんにちは、たろうさん!
4. インスタンス化とメソッドとは?
先ほどの説明で「インスタンス化」や「メソッド」という言葉が出てきました。プログラミング初心者の方が一番最初につまずきやすいポイントなので、丁寧に解説します。パソコンの操作で例えると、とても簡単です。
インスタンス化とは、料理で言うなら「レシピ(クラス)」を見て、実際に「料理(インスタンス)」を一つ作ることです。レシピだけでは食べられませんが、実際に作れば食べることができますよね。プログラムも同じで、設計図であるクラスをnewすることで、実際に動く「モノ」として誕生させるのです。
メソッドとは、その「モノ」ができる「特技」や「仕事」のことです。先ほどの例では、UserModelというモノが持っている「名前を教える」という特技がメソッドにあたります。$userModel->getUserName()の「->」という記号は、「~の(特技を実行する)」という意味の矢印だと覚えておきましょう。つまり、「ユーザーモデルさんの、名前を教える特技を使って!」という命令を出しているのです。
5. 複数のデータをモデルから取得して表示する
次はもう少し実践的な例を見てみましょう。ブログのタイトル一覧をモデルから取得して、コントローラで受け取るパターンです。実際のWeb制作では、一つのデータだけでなく、たくさんのデータをまとめて扱うことがよくあります。
複数のデータを扱うときは、配列という仕組みを使います。配列は「仕切りのある箱」のようなもので、一つの変数にたくさんの情報を入れることができます。モデルに複数のタイトルを準備してもらい、それをコントローラで呼び出してみましょう。
// モデル側のコード(BlogModel.php)
namespace App\Models;
use CodeIgniter\Model;
class BlogModel extends Model
{
public function getBlogTitles()
{
// 複数のデータを箱(配列)に入れて返します
return ["はじめてのPHP", "CodeIgniter入門", "モデルの使い道"];
}
}
これをコントローラで呼び出し、画面に一つずつ表示する命令を書いてみます。ここで使うforeachは「箱の中身を全部順番に取り出す」という便利な魔法の言葉です。
// コントローラ側のコード(BlogController.php)
namespace App\Controllers;
use App\Models\BlogModel;
class BlogController extends BaseController
{
public function showList()
{
$blogModel = new BlogModel();
$titles = $blogModel->getBlogTitles();
echo "<h2>記事一覧</h2>";
foreach ($titles as $t) {
echo "・" . $t . "<br>";
}
}
}
このように書くと、画面には「記事一覧」という見出しの下に、3つの記事タイトルが並んで表示されます。モデルがデータを集め、コントローラがそれをどう見せるかを決める、という連携がスムーズに行われていますね。
6. 便利な「model()」関数を使った呼び出し方
CodeIgniterには、もっと簡単にモデルを呼び出すための「model()ヘルパー関数」という近道が用意されています。これを使うと、わざわざ一番上に「use App\Models\...」と書かなくても、一行でモデルを呼び出すことができます。
初心者の方は、まずこの短い書き方から覚えてしまうのも一つの手です。プログラムの世界では、同じ結果になるなら、できるだけ短くシンプルに書くことが良いとされています。コードがスッキリすると、後で見返したときに間違いを見つけやすくなるからです。
namespace App\Controllers;
class ProductController extends BaseController
{
public function detail()
{
// model()関数を使えば、一行で準備OK!
$productModel = model('App\Models\ProductModel');
// あとはいつも通り使うだけ
$price = $productModel->getPrice(101); // 商品ID 101の価格を取得するイメージ
echo "商品の価格は " . $price . " 円です。";
}
}
このように、model('モデルの場所')と書くだけで、自動的にnewしたのと同じ状態にしてくれます。とても賢い機能ですね。パソコンで言うところの「ショートカットアイコン」をクリックするような感覚で、手軽に目的の機能を呼び出せるのです。
7. データベースと連携した本格的な呼び出し
最後に、より本物のWebサイトに近い形をご紹介します。これまでは決まった文字を返していましたが、実際にはデータベースに保存された「本物のデータ」を取り出します。CodeIgniterのモデルには、最初から「データを全部取ってくる」という機能(findAll)が備わっています。
モデル側でテーブル名を指定しておけば、コントローラからたった一行の命令を出すだけで、何百件、何千件というデータを一瞬で取得できます。これがフレームワークと呼ばれるCodeIgniterの本当の凄さです。
namespace App\Controllers;
use App\Models\ItemModel;
class ItemController extends BaseController
{
public function listAll()
{
$itemModel = new ItemModel();
// データベースのテーブルから全てのデータを取ってくる魔法の言葉
$data['items'] = $itemModel->findAll();
// 取得したデータの個数を数えて表示してみる
echo "現在、商品は " . count($data['items']) . " 点登録されています。";
}
}
findAll()というメソッドは、あなたが自分で作らなくてもCodeIgniterが「これよく使うでしょ?」と最初からプレゼントしてくれている機能です。これを使うことで、難しいデータベースの操作を意識せずに、簡単に高度なシステムを作ることができます。コントローラは、この強力な機能を「いつ、どこで使うか」を指示する司令塔なのです。
8. エラーが起きた時のチェックポイント
プログラムを書いていて、画面が真っ白になったり、英語のメッセージが出たりすると不安になりますよね。でも大丈夫です。初心者がモデルの呼び出しで失敗する原因は、ほとんどが以下の3つです。もし動かなかったら、落ち着いて確認してみましょう。
一つ目は「スペルミス」です。例えば、モデルのファイル名は「UserModel」なのに、コントローラで「Usermodel」(mが小文字)と書いてしまうと、コンピュータは「そんな名前の人は知りません!」とエラーを出します。大文字と小文字は厳密に区別されるので、鏡を見るように正確に書きましょう。
二つ目は「場所の間違い」です。モデルをapp/Models以外の場所に置いていないか確認してください。お箸をキッチンの引き出しではなく、お風呂場に置いてしまったら見つかりませんよね。決まった場所に置くことが、スムーズに呼び出すコツです。三つ目は「カッコやセミコロンの忘れ」です。文章の終わりの句読点「。」のように、プログラムの行の最後には必ず「;(セミコロン)」が必要です。これ一つ忘れるだけでプログラムは動かなくなるので、指差し確認をする習慣をつけると、プログラミングがどんどん楽しくなりますよ!