Ground Sunlight

Windowsで作る - PHPプログラミングの開発環境

ユーザ用ツール

サイト用ツール


サイドバー

メインメニュー

XAMPP アレンジ

IED

WSL2

道具箱

リポジトリ編

フレームワーク編

公開ソフトウェア

メタ
リンク


このページへのアクセス
今日: 1 / 昨日: 0
総計: 1409

apricot:app:db-model

文書の過去の版を表示しています。


編集中

Apricot データベースとモデル

データベースの構築

Apricotでは以下のユーザテーブルを持っています。

テーブル名 : user

カラム名主Key属性説明
idintegerautoincrementID
accounttext unique not nullアカウント
passwordtext not nullパスワード
emailtext not nullEメールアドレス
notetext 備考
remember_tokentext 自動ログイン用
created_attext not null作成日
updated_attext not null更新日
version_nointeger default 0 not nullバージョンNo
  • ユーザ認証は(account,password)で行います
  • remember_tokenは自動ログイン用の認証トークンです
  • version_noは楽観的ロックで使用します

SQLファイル

Apricotではアプリ起動時にデータベースにテーブルが存在しない時、テーブルを自動生成します。テーブル作成用のsqlは以下のファイルに保存します。このファイルは後述のORMの初期設定ファイルで使用されます。

/apricot/assets/sql

create.sql
/*
 * User Table
 */
CREATE TABLE IF NOT EXISTS USER
(
    id INTEGER PRIMARY KEY autoincrement,
    account text UNIQUE NOT NULL,
    password text,
    email text NOT NULL,
    note text,
    remember_token text,
    created_at text NOT NULL,
    updated_at text NOT NULL,
    version_no INTEGER DEFAULT 0 NOT NULL
);

SQLファイルについて

  • SQLの文法及び使用できる関数などは使用しているデーターベース(ApricotではSQLite)に依存します。
  • コメントは行コメント( –Comment )とブロックコメント( /* Comment */ )が使用できます。
  • 文はセミコロン( ; )で区切って下さい。
  • 連続する空白( TAB, Space, 改行文字 )は1つの空白と同じにみなされます。


ORMの設定

ORマッパーにはIdiormを使用します。Idiormは元々シングルトンとして実装してあるのでそのまま使えます。使い方やメソッドについてはIdiormのマニュアルを参照して下さい。

設定ファイル

/apricot/config/setting

idiorm.setting.php
<?php
return
[
    'sqlite' => [
        'db_file' => var_dir('db/apricot.sqlite'),
        'connection_string' => 'sqlite:'.var_dir('db/apricot.sqlite'),
        'caching' => true,
        'logging' => true,
    ],
    'initial_data' => [
        'user'=> [
            'exec' =>[
                'delete from sqlite_sequence where name=\'user\'',
            ],
            'rows' => [
                [
                    'account' =>'root',
                    'password' =>password_hash('', PASSWORD_DEFAULT),
                    'email' =>'root@sample.com',
                    'note' =>'Initial User',
                ],
            ],
        ],
    ],
];
  • sqlite : 接続設定(apricotではSQLiteを使用します)
    • sqlite.db_file — データベースファイルのパス (既定値は var/db/apricot.sqlite')
    • sqlite.connection_string — 接続文字列
    • sqlite.caching — キャッシングの有無
    • sqlite.logging — ロギングの有無
  • initial_data : 初期データ (テーブルが空の時に自動設定されます)
    • {テーブル名} — ここではユーザテーブル( user )を指定しています
      • exec — 実行したいSQLを記述します(複数指定可)
      • rows — 行データを設定します(複数指定可)

接続設定の詳細は以下を参照して下さい:
https://idiorm.readthedocs.io/en/latest/configuration.html#id1


初期設定ファイル

データベースの設定は初期設定ファイルで行います。

/apricot/config/setup

idiorm.setup.php
<?php
//-------------------------------------------------------------------
// ORM(idirom)の初期設定
//-------------------------------------------------------------------
return function():bool
{
    // データベースファイルの準備
    $db_file = config('idiorm.sqlite.db_file');
    if (!file_exists($db_path=dirname($db_file)))
    {
        mkdir($db_path,null,true);
    }
 
    // DBファイルの存在確認
    $new_db_file = !file_exists($db_file);
 
    // データベース接続
    ORM::configure([
        'connection_string' => config('idiorm.sqlite.connection_string'),
        'caching' => config('idiorm.sqlite.caching',false),
        'logging' => false,
        'logger' => function($log_string, $query_time)
        {
            // SQL debug logging
            \Core\Log::info("SQL",[$log_string]);
        },
    ]);
 
    //-------------------------------------------
    // テーブルの作成 (新しくDBを作った時)
    //-------------------------------------------
    if ($new_db_file)
    {
        $sql_text = file_get_sql(assets_dir('sql/create.sql'));
        if (!empty($sql_text))
        {
            foreach($sql_text as $sql)
            {
                ORM::get_db()->exec($sql);
            }
        }
    }
 
    //-------------------------------------------
    // 初期ユーザの作成 (ユーザテーブルが空の時)
    //-------------------------------------------
    $initial_data = config('idiorm.initial_data');
    if (isset($initial_data))
    {
        foreach($initial_data as $key=>$item)
        {
            if(ORM::for_table($key)->find_one()===false)
            {
                if (array_key_exists('exec', $item))
                {
                    // SQLの実行
                    $exec = (array)$item['exec'];
                    foreach($exec as $sql)
                    {
                        ORM::get_db()->exec($sql);
                    }
                }
                if (array_key_exists('rows', $item))
                {
                    // 新しいレコードの作成
                    $rows = (array)$item['rows'];
                    foreach($rows as $row)
                    {
                        $row = ORM::for_table($key)->create($row);
                        $row->set_expr('created_at', "datetime('now')");
                        $row->set_expr('updated_at', "datetime('now')");
                        $row->save();
                    }
                }
            }
        }
    }
 
    // SQLログ開始
    ORM::configure('logging' , config('idiorm.sqlite.logging',false));
    return true; // Must return true on success
};

初期設定ファイルでは以下の事をおこないます:

  • データベースの保存フォルダが存在しない場合は作成します
  • データベースへの接続
  • テーブルの作成 (新しくDBを作った時)
  • 初期ユーザの作成 (ユーザテーブルが空の時)
  • SQLログの開始 (logging設定がtrueの場合)


アプリケーション設定の変更

上で作った idiorm.setup.php をアプリケーションの設定ファイル(app.php)に追加します。

/apricot/config

app.php
<?php
return
[
    'setup' =>[
        config_dir('setup/whoops.setup.php'),    /* Error handler(whoops) */
        config_dir('setup/bladeone.setup.php'),  /* View template (BladeOne) */
        config_dir('setup/aliases.setup.php'),   /* Class aliases for view template and so on */
        config_dir('setup/idiorm.setup.php'),    /* ORM(idiorm) */
    ],
    'middleware' =>[],
    'auth' =>[],
    'csrf' =>[],
];


テスト実行

TODO


モデルクラス

TODO


コメント

コメントを入力. Wiki文法が有効です:
 
apricot/app/db-model.1589164387.txt.gz · 最終更新: 2020/05/11 11:33 by y2sunlight