Fuelphp-models-and-database
FuelPHP-モデルとデータベース
モデルは、FuelPHP Webフレームワークで重要な役割を果たします。 アプリケーションのビジネスエンティティを表します。 これらは、顧客から提供されるか、バックエンドデータベースから取得され、ビジネスルールに従って操作され、データベースに保持されます。 この章では、モデルとバックエンドシステムとの相互作用について学習します。
モデルを作成する
FuelPHPでは、モデルは組み込みのModelクラスを拡張する単純なPHPクラスです。 デフォルトでは、モデルはコントローラーと同様にModel_の接頭辞が付いている場合があり、 fuel/app/classes/model/ フォルダーに配置する必要があります。 基本的な従業員モデルを作成し、作業を進めながら拡張してみましょう。
fuel/app/classes/model/employee.php
<?php
namespace Model;
class Model_Employee extends \Model {
public static function fetchAll() {
//Code to fetch employee from database
}
}
モデルにアクセスする
モデルが定義されると、次のようにコントローラに含めるだけで、任意のコントローラで自由に使用できます。
use \Model\Employee;
class Controller_Employee extends Controller {
public function action_index() {
$employees = Employee::fetchAll();
}
}
データベースの概要
FuelPHPは、データベースからデータを取得するための独自のデータベース抽象化レイヤーを提供します。 これは、基本的なORMと高度なORMベースのツールの両方を提供します。 基本的なツールキットは、DB、DBUtil、およびQuery_Builerベースのクラスで構成されています。 高度なツールキットはOrmです。 Ormツールキットは、ベースツールキットから派生し、個別のパッケージとしてバンドルされています。
データベース構成
FuelPHPはデータベース設定をメイン設定ファイルから分離し、ファイルは fuel/app/config/db.php です。 環境ごとに個別の設定をサポートします。 現在、FuelPHPはMySQL、MySQLi、およびPDOドライバーをサポートしています。 サンプル設定は次のとおりです-
<?php
return array (
'development' => array (
'type' => 'mysqli',
'connection' => array (
'hostname' => 'localhost',
'port' => '3306',
'database' => 'finddevguides_fueldb',
'username' => 'root',
'password' => 'password',
'persistent' => false,
'compress' => false,
),
'identifier' => '`',
'table_prefix' => '',
'charset' => 'utf8',
'enable_cache' => true,
'profiling' => false,
'readonly' => false,
),
)
DBベースのツールキット
- DBクラス*は、アプリケーションからデータベースにアクセスする最も簡単なオプションです。 データベースクエリを作成し、ターゲットデータベースに対して実行し、最終的に結果を取得するオプションを提供します。 _DB_クラスは、次のクラスと対話し、包括的なデータベースAPIを提供します。
- Database_Connection -データベースと対話するシングルトンおよびメインクラス
- Database_Query -SQLクエリを実行して結果を取得するためのベース、具象クラス
- Database_Query_Builder -SQLクエリを構築するためのベース、抽象クラス
- Database_Query_Builder_Join -SQL結合を構築するクラス
- Database_Query_Builder_Where -SQLクエリ条件を構築する抽象クラス
- Database_Query_Builder_Select -SQL選択クエリを構築する具体的なクラス
- Database_Query_Builder_Insert -SQL挿入クエリを構築する抽象クラス
- Database_Query_Builder_Update -SQL更新クエリを作成する抽象クラス
- Database_Query_Builder_Delete -SQL削除クエリを作成する抽象クラス
次の図は、クラスとクラスによって提供されるメソッドとの関係を示しています。
DB API
このセクションのDBクラスで利用可能な最も重要なメソッドを学びましょう。
実例
- 目的-新しい_Database_Connection_インスタンスを作成して返します。
- パラメータ-
- $ db -構成ファイルで定義されたデータベース接続名、オプション。
- 戻り値-_Database_Connection_オブジェクトを返します
例えば、
$db = DB::instance();
$db = DB::instance('test');
問い合わせ
- 目的-提供されたSQLステートメントを準備し、データベースからデータを挿入、更新、削除、またはフェッチするために使用できるDatabase_Queryオブジェクトを返します。
- パラメータ-
- $ query -SQLステートメント。プレースホルダーを含めることができます。
- $ type -SQLタイプ、オプション(DB :: SELECT、DB :: INSERT、DB :: UPDATEおよびDB :: DELETE)
- 戻り値-_Database_Query_オブジェクトを返します
例えば、
$query = DB::query('SELECT * FROM 'employees'');
last_query
- 目的-最後に実行されたクエリを取得する
- パラメータ-なし
- 戻り値-最後に実行されたクエリを返します
例えば、
$employees = DB::Select('Select * from 'employee'');
$sql = DB::last_query();
選択する
- 目的-クエリの選択部分を生成する
- パラメータ-
- $ columns -データベースの列名のリスト
- 戻り値-Database_Query_Builder_Selectオブジェクトを返します
例えば、
$query = DB::select(); //Select *
$query = DB::select('id', 'name');//Select id, name
select_array(DB)
selectと似ていますが、列を配列として送信できる点が異なります。
$query = DB::select_array(array('id', 'name'));//Select id, name
インサート
- 目的-クエリの挿入部分を生成する
- パラメータ-
- $ table_name -データベーステーブルの名前。
- $ columns -テーブル列の配列
- 戻り値-Database_Query_Builder_Insertオブジェクトを返します
例えば、
$query = DB::insert('employee'); //Insert into employee
$query = DB::insert('employee', array('id', 'name'));//Insert into employee (id, name)
更新
- 目的-クエリの更新部分を生成する
- パラメータ-
- $ table_name -データベーステーブルの名前
- 戻り値-Database_Query_Builder_Updateオブジェクトを返します
例えば、
$query = DB::update('employee');//update `employee`
削除する
- 目的-クエリの削除部分を生成する
- パラメータ-
- $ table_name -データベーステーブルの名前
- 戻り値-Database_Query_Builder_Deleteオブジェクトを返します
例えば
$query = DB::delete('employee'); //delete from 'employee'
クエリAPI
*Database_Query* は、データベース接続を設定し、クエリを実行し、連想配列またはオブジェクトとして結果を取得するオプションを提供します。 Database_Queryクラスが提供するメソッドを見てみましょう。
set_connection
- 目的-クエリを実行するデータベース(データベース接続の詳細)を設定する
- パラメータ-$ db-データベース接続名
- 戻り値-_Database_Query_オブジェクトを返します
例えば、
$query = DB::query('DELETE * FROM employee', DB::DELETE);
$query->set_connection('2nd-db');
param
- 目的-Queryオブジェクトで定義されたパラメーターの値を設定する
- パラメータ-
- $ param -パラメーター名;
- $ value -パラメータの値
- 戻り値-_Database_Query_オブジェクトを返します
例えば、
//set some variables
$table = 'employee';
$id = 1;
$name = 'Jon';
//don't use
$query = DB::query('SELECT *FROM '.$table.'. WHERE id = '.$id.' AND name = "'.$name.'"');
//but use
$query = DB::query('SELECT* FROM :tablename WHERE id = :id AND name = :name');
$query->param('tablename', 'employee');
$query->param('id', $id);
$query->param('name', $name);
同様の方法
*parameters* は、複数の値を一度に与えるオプションを提供することを除いて、同様のオブジェクトです。
$query->parameters (array(
'tablename' => $table,
'id' => $id,
'name' => $name
});
bind
- 目的-Queryオブジェクトで定義されたパラメーターに変数を設定する
- パラメータ-
- $ param -パラメーター名
- $ var -パラメータをバインドする変数
- 戻り値-_Database_Query_オブジェクトを返します
例えば、
//bind a query parameter
$table = 'employee';
$query = DB::query('DELETE *FROM :tablename', DB::DELETE);
$query->bind('tablename', $table);
//update the variable
$table = 'employee_salary';
//DELETE* FROM `employee_salary`;
$sql = $query->compile();
コンパイル
- 目的-SQLクエリに定義されたクエリオブジェクトをコンパイルするには
- パラメータ-
- $ db -接続文字列、オプション
- 返品-
例えば、
//assign a value to a query parameter
$table = 'employee';
$query = DB::query('DELETE *FROM :tablename', DB::DELETE);
$query->param('tablename', $table);
//compile the query, returns: DELETE* FROM employee
$sql = $query->compile();
実行する
- 目的-Queryオブジェクトで定義されたクエリを実行し、結果を返す
- パラメータ-
- $ db -データベース接続名
- 戻り値-結果を返します
例えば、
//assign a value to a query parameter
$table = 'employee';
$query = DB::query('DELETE * FROM :tablename', DB::DELETE);
$query->param('tablename', $table);
//execute the query
$query->execute();
as_assoc
- 目的-戻り値の型をオブジェクトではなく連想配列として設定する
- パラメータ-なし
- 戻り値-現在のオブジェクトを返します
例えば、
$query = DB::query('SELECT * FROM employee', DB::SELECT);
$result = $query->as_assoc()->execute();
foreach ($result as $row) {
echo $row['id'];
}
as_object
- 目的-戻り値の型を連想配列ではなくオブジェクトとして設定する
- パラメータ-なし
- 戻り値-現在のオブジェクトを返します
例えば、
$query = DB::query('SELECT * FROM employee', DB::SELECT);
$result = $query->as_object()->execute();
foreach ($result as $row) {
echo $row->id;
}
//have ORM model objects return instead
$result = $query->as_object('Model_Employee')->execute();
クエリビルダーAPI
クエリビルダー_(Query_Builder)ベースのクラスは、SQLクエリを動的に構築するためのオプションを提供します。 4つのクラスがあり、それぞれが(Query_Builder_Select)を選択し、(Query_Builder_Insert)を挿入し、(Query_Builder_Update)を更新し、(Query_Builder_Delete)_クエリを削除します。 これらのクラスは_Query_Builder_Where_クラス(条件を生成するオプション)から派生し、それ自体はすべてのクラスのベースである_Query_Builder_から派生します。
Query_Builderクラスが提供するメソッドを見てみましょう。
選択する
- 目的-選択クエリの列を生成します。
- パラメータ-
- $ columns -列のリスト、オプション
- 戻り値-現在のインスタンスを返します
例えば、
$query = DB::select('name') //select `name`
$query = DB::select(array('first_name', 'name'))//select `first_name` as `name`
from
- 目的-選択クエリのテーブル詳細を生成するには
- パラメータ-
- $ tables -テーブルのリスト
- 戻り値-現在のインスタンスを返します
例えば、
$query = DB::select('name')->from('employee')//select `name` from `employee`
どこで
- 目的-クエリの選択、挿入、更新の条件を生成するには
- パラメータ-
- $ column -列名または配列($ column、$ alias);
- $ op -論理演算子、=、!=、IN、BETWEEN、LIKE、オプション。
- $ value -列の値
- 戻り値-現在のインスタンスを返します
例えば、
$query = DB::select('name')->from('employee')
$query = $query->where('name', '=', 'Jon');
//select `name` from `employee` where `name` = `Jon`;
同様の方法
同様のメソッドは、where_open()、and_where_open()、or_where_open()、where_close()、and_where_close()、or_where_close()です。 条件の周りに追加のキーワードと括弧を追加することを除いて、where()メソッドに似ています。 以下はサンプルコードです。
$query = DB::select('*')->from('employee');
$query->where('email', 'like', '%@gmail.com');
$query->or_where_open();
$query->where('name', 'Jon');
$query->and_where('surname', 'Peter');
$query->or_where_close();
//SELECT * FROM `employee` WHERE `email` LIKE "%gmail.com" OR
(`name` = "Jon" AND `surname` = "Peter")
join
- 目的-選択クエリのテーブル結合を生成するには
- パラメータ-
- $ table -テーブル名または配列($ table、$ alias);
- $ type -結合タイプ(LEFT、RIGHT、INNERなど)
- 戻り値-現在のインスタンスを返します
例
$query = DB::select('name')->from('employee')->join('employee_salary')
//select `name` from `employee` JOIN `employee_salary`
on
- 目的-選択クエリで結合の条件を生成するには
- パラメータ-
- $ c1 -テーブル名または配列内のエイリアスを含むテーブル名。
- $ op -論理演算子。
- $ c2 -テーブル名または配列内のエイリアスを含むテーブル名
- 戻り値-現在のインスタンスを返します
例えば、
$query = DB::select('name')->from('employee')->join('employee_salary')
$query = $query->on('employee.employee_id', '=', 'employee_salary.employee_id')
//select `name` from `employee` JOIN `employee_salary` on
//`employee.employee_id` = `employee_salary.employee_id`
同様の方法
関連するメソッドはand_on()およびor_on()です。 追加のキーワードと結合を囲む括弧を追加することを除いて、on()に似ています。
group_by
- 目的-クエリによってグループを生成するには
- パラメータ- $ columns -結果をグループ化する列名
- 戻り値-現在のインスタンスを返します
例えば、
$query = DB::select('name')->from('employee')
$query = $query->group_by('name');
//select `name` from `employee` group by `name`
持っている
- 目的-SQLクエリの条件によってグループを生成するには
- パラメータ- $ column -列名または配列($ column、$ alias); $ op -論理演算子、=、!=、IN、BETWEEN、LIKE、オプション。 $ value -列の値
- 戻り値-現在のインスタンスを返します
例
$query = DB::select('name')->from('employee')
$query = $query->group_by('name');
$query = $query->having('name', '!=', 'Jon');
//select `name` from `employee` group by `name` having `name` != `Jon`
同様の方法
同様のメソッドは、having_open()、and_having_open()、or_having_open()、having_close()、and_having_close()、or_having_close()です。 条件の周りに追加のキーワードとブラケットを追加することを除いて、having()メソッドに似ています。
リセット
- 目的-クエリをリセットするには
- パラメータ-なし
- 戻り値-現在のインスタンスを返します
例えば、
$query = DB::select('name')->from('employee')
$query->reset()
$query = DB::select('name')->from('employee_salary')
//select `name` from `employee_salary`
DBUtilクラス
DBUtilクラスは、日常的なデータベース操作を管理および実行するオプションを提供します。 重要な方法のいくつかは次のとおりです-
- set_connection-デフォルトの接続を設定します
DBUtil::set_connection('new_database');
- create_database-データベースを作成します。
DBUtil::create_database('my_database');
- drop_database-データベースを削除します。
DBUtil::drop_database('my_database');
- table_exists-指定されたテーブルが存在するかどうかを確認します。
if(DBUtil::table_exists('my_table')) {
//Table exists
} else {
//Table does NOT exist, create it!
}
- drop_table-テーブルを削除します。
DBUtil::drop_table('my_table');
- create_table-テーブルを作成します。
\DBUtil::create_table (
'users',
array (
'id' => array('type' => 'int', 'auto_increment' => true),
'name' => array('type' => 'text'),
),
);
Ormツールキット
FuelPHPは、人気のある Active record pattern に基づいたORMコンセプトを使用した高度なデータベースレイヤーを提供します。 ツールキットはアプリケーションに含まれていますが、デフォルトでは構成されていません。 パッケージとしてバンドルされており、パッケージ名はormです。 メイン構成ファイル fuel/app/config/config.php に次の構成を追加して、ormツールキットをロードできます。
'always_load' => array (
'packages' => array (
'orm',
),
),
モデルを作成する
Ormは、基本モデルクラスOrm \ Modelを提供します。 ORM機能を使用するには、ormモデルでモデルを拡張する必要があります。 以下はサンプルコードです。
class Model_Employee extends Orm\Model {}
設定
Ormは、ORM機能を使用するようにモデルを構成するための設定セットを提供します。 彼らは次のとおりです-
*connection* -接続名を指定するには、モデルに静的な__connection_プロパティを設定します。
class Model_Employee extends Orm\Model {
protected static $_connection = "production";
}
テーブル名-モデルに静的な__table_name_プロパティを設定して、バックエンドテーブルのテーブル名を指定します。
class Model_Employee extends Orm\Model {
protected static $_table_name = 'employee';
}
*primary key* -モデルに静的な__primary_key_プロパティを設定して、バックエンドテーブルの主キーを指定します。
class Model_Employee extends Orm\Model {
protected static $_primary_key = array('id');
}
*Columns* -モデルに静的_propertiesプロパティを設定して、バックエンドテーブルの列を指定します。 data_type、label、validation、form elememtsなどをサポートしています。
class Model_Employee extends Orm\Model {
protected static $_properties = array (
'id',
'name' => array (
'data_type' => 'varchar',
'label' => 'Employee Name',
'validation' => array (
'required',
'min_length' => array(3),
'max_length' > array(80)
),
'form' => array (
'type' => 'text'
),
),
'age' => array (
'data_type' => 'int',
'label' => 'Employee Age',
'validation' => array (
'required',
),
'form' => array (
'type' => 'text'
),
),
);
}
条件-静的な__conditions_プロパティを設定して、オプションと条件を設定します。
class Model_Employee extends Orm\Model {
protected static $_conditions = array (
'order_by' => array('id' => 'desc'),
'where' => array (
array('is_active', > true),
),
);
}
オブザーバー-_Orm_は、特定のイベントに動作を追加するオブザーバーベースのイベントシステムを提供します。 動作を追加するには、最初にモデルでobservers_プロパティを設定します。 次に、動作をクラスとして定義し、イベントとともにobservers_プロパティに設定します。 イベントが指定されていない場合、すべてのイベントに対して動作が呼び出されます。 複数の動作も指定できます。
class Model_Employee {
protected static $_observers = array (
'example', //will call Observer_Example class for all events
'Orm\\Observer_CreatedOn' => array (
'events' => array('before_insert'),
//will only call Orm\Observer_CreatedOn at before_insert event
)
);
}
作成する
モデルを構成したら、すぐにメソッドの使用を開始できます。 _Orm_は、オブジェクトをデータベースに保存する_save_メソッドを提供します。 次のように構成されたプロパティを使用してデータを設定できます-
//option 1
$new = new Model_Employee();
$new->name = 'Jon';
$new->save();
//option 2, use forge instead of new
$new = Model_Employee::forge();
$new->name = 'Jon';
$new->save();
//option 3, use array for properties
$props = array('name' => 'Jon');
$new = Model_Employee::forge($props);
$new>save();
Read
Ormは、データベースからデータを取得してオブジェクトにバインドするメソッドfindを提供します。 findメソッドは、入力パラメーターに応じて機能します。 私たちはさまざまなオプションを見てみましょう-
*by primary key* -主キーを指定すると、設定されたテーブルの主キーと一致するレコードが返されます。
$employee = Model_Employee::find(1);
最初/最後のレコード-「最初」または「最後」を指定すると、それぞれ最初のレコードまたは最後のレコードが取得されます。 オプションで注文を渡すこともできます。
$entry = Model_Employee::find('first');
$entry = Model_Article::find('last', array('order_by' => 'id'));
すべて-「すべて」を指定すると、設定されたテーブルからすべてのレコードが取得されます。 条件と同様にオプションで順序を指定できます。
$entry = Model_Employee::find('all');
$entry = Model_Article::find ('all', array (
'where' => array (
array ('name', 'Jon'),
),
'order_by' => array ('id' => 'desc'),
));
次のように、高度な検索オプションのモデルとともに、基本的なデータベースツールキットのクエリAPIを使用できます。
$query = Model_Employee::query()->where('category_id', 1)->order_by('date', 'desc');
$number_of_employees = $query->count();
$latest_employee = $query->max('id');
$young_employee = $query->min('age');
$newest_employee = $query->get_one();
$employees = $query->limit(15)->get();
更新
モデルの更新は作成と同じです。ただし、新しいモデルを作成する代わりに、findメソッドを使用して更新するモデルをフェッチし、プロパティを更新してからsaveメソッドを次のように呼び出します。
$entry = Model_Employee:find(4);
$entry->name = 'Peter';
$entry->save();
削除する
Ormは、モデルを削除するdeleteメソッドを提供します。 オブジェクトを取得して、deleteメソッドを呼び出すだけです。
$entry = Model_Employee:find(4);
$entry->delete();
実施例
この章で実際の例を作成して、モデルとデータベースを理解しましょう。
データベースを作成する
次のコマンドを使用して、MySQLサーバーに新しいデータベースを作成します。
create database finddevguides_fueldb
次に、次のコマンドを使用してデータベース内にテーブルを作成します。
create table employee(id int primary key, name varchar(20), age int not null);
データベースを構成する
データベース構成ファイル* fuel/app/config/db.phpを使用してデータベースを構成します。 次の変更を追加して、MySQLサーバーに接続します。
<?php
return array (
'development' => array (
'type' => 'mysqli',
'connection' => array (
'hostname' => 'localhost',
'port' => '3306',
'database' => 'finddevguides_fueldb',
'username' => 'root',
'password' => 'pass',
'persistent' => false,
'compress' => false,
),
'identifier' => '`',
'table_prefix' => '',
'charset' => 'utf8',
'enable_cache' => true,
'profiling' => false,
'readonly' => false,
),
'production' => array (
'type' => 'mysqli',
'connection' => array (
'hostname' => 'localhost',
'port' => '3306',
'database' => 'finddevguides_fueldb',
'username' => 'root',
'password' => 'pass',
'persistent' => false,
'compress' => false,
),
'identifier' => '`',
'table_prefix' => '',
'charset' => 'utf8',
'enable_cache' => true,
'profiling' => false,
'readonly' => false,
),
);
ORMパッケージを含める
メイン構成ファイル fuel/app/config/config.php を更新して、次の構成を追加してORMパッケージを含めます。
'always_load' => array (
'packages' => array (
'orm'
),
),
これで、アプリケーションでORMが有効になりました
従業員モデルを作成
モデルフォルダー*“ fuel/app/classes/model” *の下に新しいモデルEmployeeを作成します。 次のように定義されています。
*Employee.php*
<?php
class Model_Employee extends Orm\Model {
protected static $_connection = 'production';
protected static $_table_name = 'employee';
protected static $_primary_key = array('id');
protected static $_properties = array (
'id',
'name' => array (
'data_type' => 'varchar',
'label' => 'Employee Name',
'form' => array (
'type' => 'text'
),
),
'age' => array (
'data_type' => 'int',
'label' => 'Employee Age',
'form' => array (
'type' => 'text'
),
),
);
}
アクションを作成
次のように、 fuel/app/classes/controller/employee.php にあるEmployeeコントローラーで新しいアクション action_model を作成します。
class Controller_Employee extends Controller {
public function action_model() {
//db based sql command to delete all employees
$query = db::query('delete from `employee`');
$query->execute('production');
//orm based query to add new employees
$model = new model_employee();
$model->name = "john";
$model->age = 25;
$model->save();
$model = new model_employee();
$model->name = "peter";
$model->age = 20;
$model->save();
//orm based query to fetch all employee data
$data = array();
$data['emps'] = model_employee::find('all');
return response::forge(view::forge('employee/model', $data));
}
}
ビューを作成
次に、“ fuel/app/views/employee” *にある *model.php ビューファイルを作成します。 ファイルに次の変更を追加します。
<ul>
<?php
foreach($emps as $emp) {
?>
<li><?php echo $emp['name']; ?></li>
<?php
}
?>
</ul>
ここで、URL http://localhost:8080/employee/model *をリクエストすると、次の結果が生成されます。