{"id":21300799,"url":"https://github.com/tekku-taro/db-model","last_synced_at":"2025-03-15T18:19:03.616Z","repository":{"id":44331322,"uuid":"409211164","full_name":"tekku-taro/db-model","owner":"tekku-taro","description":"PHPでリレーショナルデータベースを操作するための O/Rマッパーです。以前作成した php-ormapper の改良版です。","archived":false,"fork":false,"pushed_at":"2022-10-22T07:43:54.000Z","size":220,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-01-22T07:49:27.404Z","etag":null,"topics":["orm-library","php7"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tekku-taro.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-09-22T13:15:41.000Z","updated_at":"2022-09-03T07:27:42.000Z","dependencies_parsed_at":"2022-08-30T05:41:59.933Z","dependency_job_id":null,"html_url":"https://github.com/tekku-taro/db-model","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tekku-taro%2Fdb-model","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tekku-taro%2Fdb-model/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tekku-taro%2Fdb-model/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tekku-taro%2Fdb-model/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tekku-taro","download_url":"https://codeload.github.com/tekku-taro/db-model/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243769987,"owners_count":20345217,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["orm-library","php7"],"created_at":"2024-11-21T15:31:44.360Z","updated_at":"2025-03-15T18:19:03.583Z","avatar_url":"https://github.com/tekku-taro.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DB Model\r\n\r\nPHPでリレーショナルデータベースを操作するための O/Rマッパーです。以前作成した **php-ormapper** の改良版です。\r\nこのライブラリを使って、データベース／テーブルの作成・更新やレコードの作成・更新・取得などが可能です。\r\n\r\n## 使い方\r\n\r\n## モデルクラス\r\n\r\n*\\Taro\\DBModel\\Models\\Model* クラスを継承します\r\n\r\n```php\r\nclass Post extends Model\r\n{\r\n    // フィールド名を protected で定義\r\n    protected $title;\r\n\r\n    protected $body;\r\n\r\n    // リレーションメソッドを定義\r\n    public function relatedComments()\r\n    {\r\n        return $this-\u003ehasMany(Comment::class);\r\n    } \r\n}\r\n```\r\n\r\n### リレーションの定義\r\n\r\nモデルクラス内に、リレーションメソッドを定義します。\r\n以下の関係を定義できます。\r\n\r\n* 1対1：hasOne(関係先のモデルクラス);\r\n* 1対多：hasMany(関係先のモデルクラス);\r\n* 多対1：belongsTo(関係先のモデルクラス);\r\n* 多対多：manyToMany(関係先のモデルクラス, 中間テーブル名);\r\n* 中間モデルを介した１対多：hasManyThrough(関係先のモデルクラス, 中間モデルクラス);\r\n* 中間モデルを介した多対1：belongsToThrough(関係先のモデルクラス, 中間モデルクラス);\r\n\r\n```php\r\n// モデル と Post が1対1\r\npublic function post()\r\n{\r\n    return $this-\u003ehasOne(Post::class);\r\n}\r\n\r\n// モデル と Post が1対多\r\npublic function posts()\r\n{\r\n    return $this-\u003ehasMany(Post::class);\r\n}\r\n\r\n// モデル と User が多対1\r\npublic function user()\r\n{\r\n    return $this-\u003ebelongsTo(User::class);\r\n}   \r\n\r\n// モデル と Post が favorites 中間テーブルを介して 多対多\r\npublic function favoritePosts()\r\n{\r\n    return $this-\u003emanyToMany(Post::class , 'favorites');\r\n}\r\n\r\n// モデル と Comment が Postモデルを介して 1対多\r\npublic function comments()\r\n{\r\n    return $this-\u003ehasManyThrough(Comment::class, Post::class);\r\n}\r\n\r\n// モデル と User が Postモデルを介して 多対1\r\npublic function users()\r\n{\r\n    return $this-\u003ebelongsToThrough(User::class, Post::class);\r\n} \r\n\r\n```\r\n\r\n\r\n\r\n### レコードの新規作成\r\n\r\n方法1：インスタンスを作成し、プロパティに値を代入して保存します\r\n\r\n   ```php\r\n   $post = new Post;\r\n   $post-\u003etitle = 'title1';\r\n   $post-\u003ebody = 'test';\r\n   $post-\u003einsert();\r\n   ```\r\n\r\n   \r\n\r\n方法2：**fill**メソッドに、配列を渡して一括保存します\r\n\r\n```php\r\n$post = new Post();\r\n$data = [\r\n    'title'=\u003e'How to cook pizza2',\r\n    'content'=\u003e'test create from array'\r\n];\r\n$post-\u003efill($data)-\u003einsert();\r\n\r\n```\r\n\r\n\r\n\r\n\r\n### レコードの更新\r\n\r\n方法1：インスタンスのプロパティに更新データを代入します。\r\n\r\n   ```php\r\n   $post = Post::query()-\u003efindById(1);\r\n   $post-\u003ebody = 'updated';\r\n   $post-\u003eupdate();\r\n   ```\r\n\r\n   \r\n\r\n方法2：インスタンスの**fill**メソッドに、更新データを配列で渡して更新します。\r\n\r\n   ```php\r\n   $post = Post::query()-\u003efindById(1);\r\n   $data = [\r\n       'body' =\u003e 'updated'\r\n   ];\r\n   $post-\u003efill($data)-\u003eupdate();\r\n   ```\r\n\r\n### レコードの削除\r\n\r\n```php\r\n$post = Post::query()-\u003efindById(1);\r\n$post-\u003edelete();\r\n```\r\n\r\n## クエリビルダとクエリの実行\r\n\r\nモデルクラスの **query** を起点にクエリを作成していきます。\r\n\r\n### クエリビルダの作成\r\n\r\n必要なメソッドをメソッドチェーンで繋いでいきます。\r\n\r\n```php\r\n// where(カラム名, 値) 又は、 where(カラム名, oper, 値)\r\nPost::query()-\u003ewhere('title', 'IN', ['test1', 'test2'])\r\nPost::query()-\u003ewhere('id', '1')\r\n// whereIn(カラム名, 値の配列)\r\nPost::query()-\u003ewhereIn('id', [1,2,3])\r\n// whereBetween  (カラム名, min, max)  \r\nPost::query()-\u003ewhereBetween('id', 2, 4)\r\n\r\n// orderBy(カラム名, ['DESC' | 'ASC'])\r\nPost::query()-\u003eorderBy('id', 'DESC')\r\n// limit(取得数)\r\nPost::query()-\u003elimit(2)\r\n// groupBy(カラム名)\r\nPost::query()-\u003egroupBy('user_id')\r\n    \r\n// カラムを選択\r\nPost::query()-\u003eselect('title','body')\r\n```\r\n\r\n### クエリの実行\r\n\r\nクエリビルダを作成した後、あるいは単独で実行できるメソッド。\r\n\r\n```php\r\n// 複数のモデルを取得\r\n$posts = Post::query()-\u003ewhere('id', '\u003e', '2')-\u003egetAll();\r\n// 複数のレコードを配列で取得\r\n$posts = Post::query()-\u003ewhere('id', '\u003e', '2')-\u003egetArrayAll();\r\n// 最初のレコードを取得\r\n$posts = Post::query()-\u003ewhere('id', '1')-\u003egetFirst();\r\n// モデルクラスから単独で実行できる\r\n$posts = Post::query()-\u003egetAll();\r\n\r\n// 集計用のメソッド\r\n// count, average, max, min, sum\r\nPost::query()-\u003ecount();\r\nPost::query()-\u003ecount('views'); // カラムを指定\r\n```\r\n\r\n### 複雑な WHERE 句の作成\r\n\r\n**Wh** クラスを使って、Where句を作成できます。作成後にクエリビルダの**addWhClause**メソッドで、クエリに追加します。\r\n\r\n```php\r\n$query = Post::query();\r\n// where 句の作成\r\n// WHERE (views \u003e 2) AND (hidden = \"public\") OR (title = \"test3\")\r\n$where = new Wh();       \r\n$where-\u003eadd('views', '\u003e', '2');\r\n$where-\u003eaddAnd('hidden','public');\r\n$where-\u003eaddOr('title', 'test3');\r\n// where句をクエリに追加\r\n$query-\u003eaddWhClause($where);\r\n\r\n$posts = $query-\u003egetAll();\r\n```\r\n\r\n入れ子の構造を作成するには、Whの **static なメソッド**を使います。\r\n\r\n```php\r\n$where = new Wh();\r\n// WHERE (hidden = \"public\") AND ((views \u003e 2) OR (title = \"test3\"))\r\n$where-\u003eaddBlock(\r\n    Wh::and(\r\n        Wh::block('hidden', 'public'),\r\n        Wh::or(\r\n            Wh::block('views', '\u003e', '2'),\r\n            Wh::block('title', 'test3')\r\n        )\r\n    )\r\n);    \r\n$query2-\u003eaddWhClause($where);\r\n```\r\n\r\n### モデルのリスト用クラス\r\n\r\nクエリビルダで **getAll**・**getArrayAll** 実行後の結果は、**ActiveList** を実装したクラスのオブジェクトとして返されます。AcitveList は **ArrayList**, **ObjectList** のインターフェースです。配列として扱えるうえ、リストを操作する便利なメソッドを提供します。\r\n\r\n- ArrayList: 配列データが対象\r\n- ObjectList: モデルオブジェクトのリストが対象\r\n\r\n```php\r\n// getAllの戻り値は、モデルのリストオブジェクト（ObjectList）になります\r\n$posts = Post::query()-\u003ewhere('id', '\u003e', '2')-\u003egetAll();\r\n// getArrayAllの戻り値は、配列のリストオブジェクト（ArrayList）になります\r\n$posts = Post::query()-\u003ewhere('id', '\u003e', '2')-\u003egetArrayAll();\r\n```\r\n\r\n\r\n\r\n#### 上記インターフェースが提供するメソッド\r\n\r\n```php\r\nmerge(): ActiveList 同士の結合\r\n\r\norderBy(key, 'asc'): リストの並び替え\r\norderBy(callback)\r\n\r\npluck(key): リストの各要素の特定キーのみを取得する\r\n\r\nfilter(condition): リストを条件で絞り込む\r\n\r\nshift():  先頭を取得してリストから取り除く\r\n\r\npop()：末尾を取得してリストから取り除く\r\n\r\nfirst(): リストの先頭を取得\r\n\r\nlast(): リストの末尾を取得\r\n\r\nslice(offset, length): 先頭から offset 番目から length 個取り出す\r\n\r\nmap(callback): 各要素に処理を実行する\r\n\r\nifAny(callback): 条件が true のものがひとつでもあるか\r\n\r\nifAll(callback): すべての要素で条件が true になるか\r\n\r\ngroupBy(key): key の値でリストをグループ分けする\r\n\r\ntoArray(): 格納したデータを配列として返す \r\n    \r\nclone(): リストのクローン（シャローコピー）\r\n    \r\n// 使用例　Post の id \u003e= 3 のレコードの title を配列で取得\r\n$posts = Post::query()-\u003egetAll();\r\n$titles = $posts-\u003efilter(function($item) {\r\n    return $item-\u003eid \u003e= 3;\r\n})-\u003epluck('title');\r\n```\r\n\r\n### ページネーション\r\n\r\nレコードを指定した数のモデルを取得、戻り値は Paginator クラスになります。\r\n\r\n```php\r\n// paginate(一度に取得するレコード数)\r\n$posts = Post::paginate(10);\r\n?\u003e    \r\n\u003c?php foreach ($posts as $post): ?\u003e\r\n    \u003cul\u003e\r\n     \u003cli\u003e\u003c?= $post-\u003eid ?\u003e\u003c/li\u003e\r\n     \u003cli\u003e\u003c?= $post-\u003etitle ?\u003e\u003c/li\u003e\r\n     \u003cli\u003e\u003c?= $post-\u003ebody ?\u003e\u003c/li\u003e\r\n   \u003c/ul\u003e\r\n\u003c?php endforeach; ?\u003e\r\n\u003c?php \r\n   // リンクを表示する\r\n   $posts-\u003edispLinks(); \r\n?\u003e\r\n\r\n```\r\n\r\n### リンクデータの取得\r\n\r\nタグではなく、データのみ必要な場合は、 **getLinkData** メソッドを使います。\r\n\r\n```php\r\n$data = $posts-\u003egetLinkData(); \r\n\r\n// 以下、データのフォーマット\r\n$data =[ \r\n    'routeUrl' =\u003e 'http://localhost/posts?key1=value1',\r\n    'links' =\u003e\r\n    array (\r\n        array (\r\n            'label' =\u003e '最初',\r\n            'href' =\u003e 'http://localhost/posts?key1=value1?pageNo=0',\r\n        ),\r\n        array (\r\n            'label' =\u003e '前',\r\n            'href' =\u003e 'http://localhost/posts?key1=value1?pageNo=1',\r\n        ),\r\n        array (\r\n            'label' =\u003e 1,\r\n            'href' =\u003e 'http://localhost/posts?key1=value1?pageNo=0',\r\n        ),\r\n        array (\r\n            'label' =\u003e 2,\r\n            'href' =\u003e 'http://localhost/posts?key1=value1?pageNo=1',\r\n        ),\r\n        array (\r\n            'label' =\u003e 3,\r\n            'href' =\u003e 'http://localhost/posts?key1=value1?pageNo=2',\r\n            'selected' =\u003e true,\r\n            'disabled' =\u003e true,\r\n        ),\r\n        array (\r\n            'label' =\u003e '次',\r\n            'href' =\u003e 'http://localhost/posts?key1=value1?pageNo=2',\r\n            'disabled' =\u003e true,\r\n        ),\r\n        array (\r\n            'label' =\u003e '最後',\r\n            'href' =\u003e 'http://localhost/posts?key1=value1?pageNo=2',\r\n            'disabled' =\u003e true,\r\n        ),\r\n    ),       \r\n];\r\n\r\n```\r\n\r\n### リンクのデザインのカスタマイズ\r\n\r\nデフォルトでは、bootstrapデザインのリンクが表示されます（要Bootstrapライブラリ）。\r\n\r\nカスタマイズしたい場合は、BasicLinks クラスを拡張したクラスを作成し、Paginator::setTemplate() の引数に渡してください。\r\n\r\n```php\r\n$posts = Post::paginate(10);\r\n$posts-\u003esetTemplate(new CustomLinks);\r\n```\r\n\r\n## モデルクラスを使わないクエリ実行方法\r\n\r\n### DirectSql クラス\r\n\r\n**DirectSql** を使えば、モデルクラスを介さずクエリを作成・実行したり、直接SQL文を実行できます。\r\n\r\n```php\r\n// 直接SQL文を実行\r\n$sql = 'SELECT * FROM posts WHERE title = :title';\r\n$query = DirectSql::query()-\u003eprepareSql($sql);\r\n$query-\u003ebindParam(':title', 'my first post');\r\n$results = $query-\u003erunSql();\r\n\r\n// よりORM的な記述方法\r\n// レコードの取得\r\n$results = DirectSql::query()\r\n    -\u003etable('posts')\r\n    -\u003eselect('title','body')\r\n\t-\u003ewhere('id','\u003e=', 2)\r\n\t-\u003eorderBy('create_date')\r\n\t-\u003elimit(10)\r\n    -\u003egetAsModels(Post::class);\r\n// 更新\r\nDirectSql::query()\r\n    -\u003etable('posts')\r\n    -\u003ewhere('title', 'test')\r\n    -\u003eupdate([\r\n        'title' =\u003e 'test 1',\r\n        'body' =\u003e 'test post 1'\r\n    ]);\r\n// 削除\r\nDirectSql::query()\r\n    -\u003etable('posts')\r\n    -\u003ewhere('id', 5)\r\n    -\u003edelete();\r\n```\r\n\r\n### リレーション先のモデルの取得\r\n\r\n```php\r\n// 関連モデルのデータを取得\r\n$user = $post-\u003euser-\u003egetFirst();\r\n$posts = $user-\u003eposts-\u003egetAll();\r\n\r\n// eagerloading N+1問題の解決\r\n// eagerLoad(['リレーション名'])\r\nUser::query()-\u003eeagerLoad(['tasks'])-\u003egetAll();\r\n$tasks = $user-\u003etasks;\r\n```\r\n\r\n#### 中間テーブルレコードの作成\r\n\r\n多対多のリレーションで、中間テーブルにレコードを作成します。\r\n\r\n1. 多対多のリレーションを定義\r\n\r\n   ```php\r\n   public function favoritePosts()\r\n   {\r\n       return $this-\u003emanyToMany(Post::class , 'favorites');\r\n   }\r\n   ```\r\n\r\n   \r\n\r\n2. **insertPivot** メソッドを使って、レコードを作成\r\n\r\n```php\r\n// insertPivot(関連テーブルのid, [独自のカラムに登録するデータを配列形式で])\r\n$user-\u003efavoritePosts()-\u003einsertPivot($postId, ['star'=\u003e$star]);\r\n```\r\n\r\n#### レコードの更新\r\n\r\n**updatePivot** メソッドを使って、レコードを更新\r\n\r\n```php\r\n// updatePivot(関連テーブルのid, [独自のカラムに更新するデータを配列形式で])\r\n$user-\u003efavoritePosts()-\u003eupdatePivot($postId, ['star'=\u003e$star]);\r\n```\r\n\r\n#### レコードの削除\r\n\r\n**deletePivot** メソッドを使って、レコードを削除\r\n\r\n```php\r\n// deletePivot(関連テーブルのid)\r\n$user-\u003efavoritePosts()-\u003edeletePivot($postId);\r\n```\r\n\r\n## \r\n\r\n## DB接続設定ファイル\r\n\r\n*プロジェクトルート/config/database.php* ファイル内にデータベース接続情報を登録します。 **.env** ファイルに記載した情報を使う場合は、 **env()** メソッドを使います。\r\n\r\n```php\r\n// connections 以下に、接続名をキーとして、接続情報を指定する\r\nreturn [\r\n    'default'=\u003e'mysql', // デフォルト接続先\r\n    'connections' =\u003e [\r\n        'mysql'=\u003e[\r\n            'driver'=\u003e'mysql',\r\n            'host'=\u003e'localhost',\r\n            'user'=\u003e'root',\r\n            'password'=\u003e env('DB_PASSWORD'),  // .env ファイルのデータを指定\r\n            'dbname'=\u003e'tasksdb',\r\n        ],\r\n        'pgsql'=\u003e[\r\n            'driver'=\u003e'pgsql',\r\n            'host'=\u003e'localhost',\r\n            'user'=\u003e'postgres',\r\n            'password'=\u003e'password',\r\n            'dbname'=\u003e'MyDB',\r\n            'schema'=\u003e'public',\r\n            'port'=\u003e5433,\r\n        ],\r\n        // 例では、プロジェクトルート/database 直下の database.sqlite ファイルを読み込む\r\n        'sqlite'=\u003e[\r\n            'driver'=\u003e'sqlite',\r\n            'dsn'=\u003e'sqlite:' . FileHandler::sqlitePath(),\r\n        ],\r\n    ]\r\n];\r\n```\r\n\r\n### データベースへ接続\r\n\r\nモデルクラスを使う前に、**DB::start**メソッドでDBへ接続します。\r\n\r\n```php\r\nuse Taro\\DBModel\\DB\\DB;\r\n// 引数として利用する接続名を渡す（省略すると、database.phpに記載したdefault値が使われる）\r\n$db = DB::start('mysql', true);\r\n\r\n// 接続を閉じる\r\nDB::stopGlobal();\r\n```\r\n\r\n### トランザクション制御\r\n\r\nDBクラスを使って、トランザクションをコントロールします。\r\n\r\n```php\r\n// トランザクション開始\r\nDB::beginTrans();\r\n// ロールバック\r\nDB::rollback();\r\n// コミット\r\nDB::commit();\r\n```\r\n\r\n\r\n\r\n\r\n\r\n## DDL関連\r\n\r\n### データベースの管理\r\n\r\nデータベースの作成や削除を実行します。(Sqlite は対象外)\r\n\r\n```php\r\nuse Taro\\DBModel\\Schema\\Database;\r\n\r\n// データベースを作成\r\nDatabase::create('データベース名');\r\n// データベースを削除\r\nDatabase::dropIfExists('データベース名');\r\n```\r\n\r\n### テーブルの作成\r\n\r\n**Schema::createTable** を使い、テーブルを作成します。引数のコールバックのタイプヒンティングにはデータベースに応じて、MySqlTable／PostgreSqlTable／SqliteTable を指定してください。\r\n\r\n```php\r\nuse Taro\\DBModel\\Schema\\Schema;\r\nuse Taro\\DBModel\\Schema\\MySql\\MySqlTable;\r\n// use Taro\\DBModel\\Schema\\PostgreSql\\PostgreSqlTable;\r\n// use Taro\\DBModel\\Schema\\Sqlite\\SqliteTable;\r\n\r\nSchema::createTable('test', function(MySqlTable $table){\r\n    $table-\u003eaddColumn('id','int')-\u003eunsigned()-\u003eprimary();\r\n    $table-\u003eaddColumn('content','text')-\u003enullable();\r\n    $table-\u003eaddColumn('status','string')-\u003elength(5)-\u003edefault('good');\r\n    $table-\u003eaddColumn('user_id','int')-\u003eunsigned();\r\n\r\n    $table-\u003eaddUnique('content', 'status');\r\n    $table-\u003eaddForeign('user_id')-\u003ereferences('users', 'id')-\u003eonDelete('CASCADE');\r\n});\r\n// データベースによっては、一部のメソッドが利用できません。（例：postgresqlでは、unsigned()　利用不可）\r\n```\r\n\r\n### テーブルの更新\r\n\r\nテーブルを更新するには、まず対象となるテーブルを**Schema::getTable**で取得し、変更内容を記述後に**Schema::alterTable**を実行します。\r\n\r\n```php\r\n// test テーブルを取得\r\n$table = Schema::getTable('test');\r\n// 変更内容を記述\r\n$table-\u003eaddColumn('post_id','int');        \r\n$table-\u003echangeColumn('status')-\u003edefault(0);\r\n$table-\u003eaddForeign('post_id')-\u003ereferences('posts','id')-\u003eonDelete('cascade')-\u003ename('FK1');\r\n$table-\u003edropForeign('fk_test2_user_id_users_id');\r\n$table-\u003edropIndexByColumns('content','status');\r\n$table-\u003eaddIndex('status')-\u003ename('INDEX1');        \r\n$table-\u003edropColumn('content');\r\n// 最後に変更クエリを実行\r\nSchema::alterTable($table);\r\n```\r\n\r\n## テーブルの削除\r\n\r\nテーブルを削除するには、**Schema::dropTableIfExists**を実行します。また、取得したテーブルを削除（**Schema::dropTable**）することもできます。\r\n\r\n```php\r\n// 取得したテーブルを削除\r\n$table = Schema::getTable('test');\r\nSchema::dropTable($table);\r\n\r\n// test テーブルを削除\r\nSchema::dropTableIfExists('test');\r\n```\r\n\r\n## テーブルの一元管理\r\n\r\n**Schema::saveTable**を使うことで、上記のテーブルの作成・更新・削除を自動で実行することもできます。コールバック内のコードを変更して実行することで、既存の同名テーブルとの差分クエリを作成してテーブルを更新します。\r\n\r\n```php\r\nuse Taro\\DBModel\\Schema\\Schema;\r\nuse Taro\\DBModel\\Schema\\MySql\\MySqlTable;\r\n// use Taro\\DBModel\\Schema\\PostgreSql\\PostgreSqlTable;\r\n// use Taro\\DBModel\\Schema\\Sqlite\\SqliteTable;\r\n\r\nSchema::saveTable('test', function(MySqlTable $table){\r\n    $table-\u003eaddColumn('id','int')-\u003eprimary();\r\n    $table-\u003eaddColumn('content','text')-\u003enullable();\r\n    $table-\u003eaddColumn('status','string')-\u003elength(5)-\u003edefault('good');\r\n\r\n    $table-\u003eaddUnique('content', 'status');\r\n});\r\n```\r\n\r\n\r\n\r\n## ライセンス (License)\r\n\r\n**DB Model**は[MIT license](https://opensource.org/licenses/MIT)のもとで公開されています。\r\n\r\n**DB Model** is open-source software licensed under the [MIT license](https://opensource.org/licenses/MIT).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftekku-taro%2Fdb-model","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftekku-taro%2Fdb-model","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftekku-taro%2Fdb-model/lists"}