CodeIgniter4のCodeIgniter\Model (1)CRUDメソッド

CodeIgniter4の CodeIgniter\Model の使い方をみてみましょう。

CodeIgniter\Model とは?

CodeIgniter4に標準で含まれているモデルクラスです。以下のような機能があります。

  • 自動データベース接続
  • 基本的なCRUDメソッド
  • モデル内でのバリデーション
  • 自動ページネーション
  • 論理削除

モデルの作成

CodeIgniter\Model を継承したモデルクラスを作成します。

app/Models/NewsModel.php

<?php

namespace App\Models;

use CodeIgniter\Model;

class NewsModel extends Model
{
    protected $table = 'news';

    protected $allowedFields = ['title', 'slug', 'body'];
}

プロパティにはテーブル名($table)と更新できるカラムのリスト($allowedFields)を設定します。 テーブルの定義は、チュートリアルを参照してください。

プライマリーキーはカラム名が id の自動インクリメントがデフォルトです。 異なる場合は、$primaryKey にカラム名を、$useAutoIncrementfalse を設定します。 なお、複合プライマリーキーには対応していません。

基本的なCRUDメソッド

データの検索

find()

プライマリーキーでレコードを検索します。

$newsItem = $newsModel->find(1);
array(4) {
  ["id"]=>
  string(1) "1"
  ["title"]=>
  string(13) "Elvis sighted"
  ["slug"]=>
  string(13) "elvis-sighted"
  ["body"]=>
  string(95) "Elvis was sighted at the Podunk internet cafe. It looked like he was writing a CodeIgniter app."
}

配列を渡すことで複数のレコードを検索できます。

$newsItems = $newsModel->find([1, 2, 3]);
array(3) {
  [0]=>
  array(4) {
    ["id"]=>
    string(1) "1"
    ["title"]=>
    string(13) "Elvis sighted"
    ["slug"]=>
    string(13) "elvis-sighted"
    ["body"]=>
    string(95) "Elvis was sighted at the Podunk internet cafe. It looked like he was writing a CodeIgniter app."
  }
  [1]=>
  array(4) {
    ["id"]=>
    string(1) "2"
    ["title"]=>
    string(16) "Say it isn't so!"
    ["slug"]=>
    string(14) "say-it-isnt-so"
    ["body"]=>
    string(64) "Scientists conclude that some programmers have a sense of humor."
  }
  [2]=>
  array(4) {
    ["id"]=>
    string(1) "3"
    ["title"]=>
    string(18) "Caffeination, Yes!"
    ["slug"]=>
    string(16) "caffeination-yes"
    ["body"]=>
    string(74) "World's largest coffee shop open onsite nested coffee shop for staff only."
  }
}
findAll()

全レコードを検索します。

$newsItems = $newsModel->findAll();

WHERE句を指定して検索します。

$newsItems = $newsModel->where('id', 1)->findAll();

LIMITとOFFSETを指定して検索します。

$newsItems = $newsModel->findAll($limit, $offset);

データの保存

insert()

レコードを挿入します。

$data = [
    'title' => '記事タイトル',
    'slug'  => 'news-title',
    'body'  => '記事の本文です。',
];
$newsModel->insert($data);
update()

プライマリーキーを指定してレコードを更新します。

$data = [
    'title' => '更新した記事タイトル',
    'slug'  => 'updated-news-title',
    'body'  => '更新した記事の本文です。',
];
$newsModel->update(1, $data);
$data = [
    'body' => 'この記事は削除されました。',
];
$newsModel->update([1, 2, 3], $data);

WHERE句を指定してレコードを更新します。

$data = [
    'body' => 'この記事は削除されました。',
];
$newsModel->whereIn('id', [1, 2, 3])->set($data)->update();

(2022-12-24 追記) 「本当は危ないCodeIgniter4のModel::update()」 も参照してください。

save()

プライマリーキーがない場合は挿入します。

$data = [
    'title' => '新しい記事タイトル',
    'slug'  => 'new-news-title',
    'body'  => '新しい記事の本文です。',
];
$newsModel->save($data);

プライマリーキーがある場合は更新します。

$data = [
    'id'    => 3,
    'title' => '更新した記事タイトル',
    'slug'  => 'updated-news-title',
    'body'  => '更新した記事の本文です。',
];
$newsModel->save($data);

データの削除

delete()

プライマリーキーを指定してレコードを削除します。

$newsModel->delete(1);
$newsModel->delete([1, 2, 3]);

WHERE句を指定してレコードを削除します。

$newsModel->where('id', 1)->delete();

CodeIgniter4のCodeIgniter\Model (2)Entityクラスの利用 へ続く。

関連

参考

Date: 2021/12/12

Tags: codeigniter, codeigniter4, database