PHPでリレーショナルデータベースのテーブル操作するための ActiveRecordタイプのORMapper ライブラリです。モデルクラスを使って、レコードの保存、クエリビルダの作成と問い合わせができます。
\ORM\Model\ActiveRecord\Model クラスを継承する
class Post extends Model
{
// 操作するテーブル名
protected static $tableName = 'posts';
// createFromArray, editWithで挿入できるカラム名
protected static $insertable = ['title', 'body', 'user_id'];
}$relations プロパティに連想配列で指定する
protected static $relations = [
# belongsTo, hasMany,hasOne の場合
# 'リレーション名'=> [ リレーション先のクラス, 'belongsTo'/'hasMany'/'hasOne' , '外部キー' ]
'posts'=>[Post::class,'hasMany' ,'user_id'],
# belongsToMany の場合
# 'リレーション名'=> [ リレーション先のクラス, 'belongsToMany' , '中間テーブル名', '自モデルの外部キー', '関連モデルの外部キー' ]
'favorites'=>[Post::class,'belongsToMany', 'favorites', 'user_id', 'post_id']
];-
インスタンスを作成し、プロパティに値を代入して保存
$post = new Post(); $post->title = 'How to cook pizza'; $post->content = 'pizza recipe content'; $post->finished = false; $post->saveNew();
-
createFromArrayメソッドに、配列を渡して一括保存
$post = new Post();
$data = [
'title'=>'How to cook pizza2',
'content'=>'test create from array',
'finished'=>true
];
$post->createFromArray($data);一括保存したいカラムはモデルクラスの**$insertable**プロパティに指定しておく
protected static $insertable = ['title', 'body', 'user_id'];-
インスタンスのプロパティに更新データを代入
$post = Post::where('id',1)->findFirst(); $post->finished = true; $post->saveUpdate();
-
インスタンスのeditWithメソッドに、更新データを配列で渡して更新
$post = Post::where('id',1)->findFirst(); $data = [ 'finished' => true ]; $post->editWith($data)->saveUpdate();
$post = Post::where('id',1)->findFirst();
$post->delete();モデルクラスからクエリビルダ作成メソッドへstaticにアクセスする
必要なメソッドをメソッドチェーンで繋いでいく
// where(カラム名, 値) 又は、 where(カラム名, oper, 値)
Post::where('id', 'IN', [1,2])
Post::where('id', '1')
// orWhere(カラム名, 値) 又は、 orWhere(カラム名, oper, 値)
Post::where('body', 'good')->orWhere('finished', 1)
// orderBy(カラム名, ['DESC' | 'ASC'])
Post::orderBy('id', 'DESC')
// limit(取得数)
Post::limit(2)
// groupBy(カラム名) having(カラム名_集計関数名, oper, 値)
Post::groupBy('user_id')->having('views_sum', '>', 4)クエリビルダを作成した後、あるいは単独で実行できるメソッド。
// 複数のレコードを取得
$posts = Post::where('id', '>', '2')->findMany();
// 最初のレコードを取得
$posts = Post::where('id', '1')->findFirst();
// モデルクラスから単独で実行できる
$posts = Post::findMany();
// 集計用のメソッド
// count, max, min, sum
Post::count();
Post::count('views'); // カラムを指定
// レコードの存在確認
$exists = Post::where('user_id', 1)->exists();
print($exists); // true or falseレコードを指定した数づつ取得して表示
// paginate(一度に取得するレコード数)
$posts = Post::paginate(10);
?>
<table>
<thead>
<tr>
<th>ID</th>
<th>title</th>
<th>body</th>
<th>Date</th>
</tr>
</thead>
<tbody>
<?php foreach ($posts as $post): ?>
<tr>
<td><?= $post->id ?></td>
<td><?= $post->title ?></td>
<td><?= $post->body ?></td>
<td><?= $post->date ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php
// リンクを表示する
$posts->showLinks();
?>// 関連モデルのデータを取得
$user = $post->relation('posts')->findFirst();
$posts = $user->relation('posts')->findMany();
// 関連モデルのカウント
$user = $user->countRelations(['posts','favorites']);
// counts['リレーション名'] でカウントにアクセス
print $user->counts['posts'];
// 関連モデルがあるレコードのみ取得
$users = User::hasRelations(['posts'])->findMany();
// 動的プロパティ
$posts = $user->posts; // $post->relation('posts')->findMany(); と同じ
// eagerloading N+1問題の解決
// with(['リレーション名'])
$user = User::with(['posts'])->findFirst();
$posts = $user->posts;newPivot(), updatePivot(), removePivot() を使って、中間テーブルのレコードを操作
// 関連モデルのレコードIDを引数として渡す
$user = $user->relation('favorites')->newPivot(3);
// 中間テーブルに追加データを保存したい
$data = ['star'=>4];
$user = $user->relation('favorites')->newPivot(3, $data);
// 追加カラムを更新
$data = ['star'=>2];
$user = $user->relation('favorites')->updatePivot(2, $data);
// レコードを削除
$user->relation('favorites')->removePivot(3);
// 中間テーブルのカラムデータを一緒に取得
// appendPivot(['追加取得するカラム名'])
$posts= $user->relation('favorites')->appendPivot(['star'])->findMany();src/config フォルダ内のDB接続設定ファイル(DbConfig.php)内にデータベース接続情報を登録する。
// $data の databasesに、接続名をキーとして、接続情報を指定する
public static $data = [
'default'=>'mysql',
'databases'=>[
'mysql'=>[
'CONNECTION'=>'mysql',
'HOST'=>'localhost',
'DB_NAME'=>'tasksdb',
'USERNAME'=>'root',
'PASSWORD'=>'pass',
],
]
];モデルクラスを使う前に、RDBAdapterクラスのinitメソッドでDBへ接続する
use ORM\Model\Adapter\RDBAdapter;
// 引数として利用する接続名を渡す(省略すると、default値が使われる)
RDBAdapter::init('mysql');Php ORMapperはMIT licenseのもとで公開されています。
Php ORMapper is open-source software licensed under the MIT license.