2013.
06.
20
14:03:07
FuelPHPではModel_Crudを継承したモデルを作成すると
あらかじめCRUD用のメソッドを含んだモデルになるのだそうな。
そこら辺をちょいと見ていこうかな、というのが今回のテーマです。
まずはテスト用のテーブルを作成φ(--)
「pk_id」が自動採番のプライマリキー、
「column_varchar01」「column_varchar02」が文字列型のカラムで、
「column_int02」が数値型のカラムです。
次にModel_Crudを継承したモデルを作ってみるφ(--)
プロパティ「$_table_name」に使用するテーブルを指定、
プロパティ「$_primary_key」にプライマリキーを指定(キー項目名が「id」の場合は省略可)、
プロパティ「$_rules」に入力チェック用のルールを指定、
プロパティ「$_defaults」に未入力時のデフォルト値を指定しています。
ここまでが前準備です(--)b
それではデータを登録してみるφ(--)
「forge()」でインスタンスを作って「set()」で投入用データを設定し
「save()」で実際にDBに保存しています。
次にデータを更新してみるφ(--)
「find_by_pk()」で既存データを取得して「set()」で値を上書きして
「save()」で保存(update)しています。
ちなみに既存データを取得しないでこんな書き方をするとφ(--)
エラーになります。
既存データの有無に寄らずプライマリキー「pk_id=2」の情報で「insert」しようとするみたいです。
の中を覗いてみたところ、「insert」か「update」の切り分けは
「$_is_new」プロパティでやっているようですね。
そして「$_is_new」プロパティは「is_new()」メソッドで強制的に上書きできるみたいです。
と言う訳で既存データを取得しない場合でも
こんなんしたらupdateになりましたφ(--)
完了\(--)/
あらかじめCRUD用のメソッドを含んだモデルになるのだそうな。
そこら辺をちょいと見ていこうかな、というのが今回のテーマです。
まずはテスト用のテーブルを作成φ(--)
CREATE TABLE IF NOT EXISTS `tbl_test01` (
`pk_id` int(10) NOT NULL AUTO_INCREMENT,
`column_varchar01` varchar(255) DEFAULT NULL,
`column_int02` int(10) DEFAULT NULL,
`column_varchar02` varchar(255) DEFAULT NULL,
PRIMARY KEY (`pk_id`),
KEY `pk_id` (`pk_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
`pk_id` int(10) NOT NULL AUTO_INCREMENT,
`column_varchar01` varchar(255) DEFAULT NULL,
`column_int02` int(10) DEFAULT NULL,
`column_varchar02` varchar(255) DEFAULT NULL,
PRIMARY KEY (`pk_id`),
KEY `pk_id` (`pk_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
「pk_id」が自動採番のプライマリキー、
「column_varchar01」「column_varchar02」が文字列型のカラムで、
「column_int02」が数値型のカラムです。
次にModel_Crudを継承したモデルを作ってみるφ(--)
<?php
class Model_Test01 extends Model_Crud
{
//使用するtable
protected static $_table_name = "tbl_test01";
//プライマリキー
protected static $_primary_key = "pk_id";
//データ検証用のルール
protected static $_rules = array(
'column_varchar01' => 'required'
);
//値未設定時のデフォルト値
protected static $_defaults = array(
'column_int02' => 100
);
}
class Model_Test01 extends Model_Crud
{
//使用するtable
protected static $_table_name = "tbl_test01";
//プライマリキー
protected static $_primary_key = "pk_id";
//データ検証用のルール
protected static $_rules = array(
'column_varchar01' => 'required'
);
//値未設定時のデフォルト値
protected static $_defaults = array(
'column_int02' => 100
);
}
プロパティ「$_table_name」に使用するテーブルを指定、
プロパティ「$_primary_key」にプライマリキーを指定(キー項目名が「id」の場合は省略可)、
プロパティ「$_rules」に入力チェック用のルールを指定、
プロパティ「$_defaults」に未入力時のデフォルト値を指定しています。
ここまでが前準備です(--)b
それではデータを登録してみるφ(--)
public function action_add()
{
//インスタンス生成
$mt = Model_Test01::forge();
//値設定
$data = array(
'column_varchar01' => 'あああ',
'column_int02' => 10,
'column_varchar02' => 'いいい',
);
$mt->set($data);
//保存
if(!$mt->save()){
print "保存失敗";
}else{
print "保存成功";
}
}
{
//インスタンス生成
$mt = Model_Test01::forge();
//値設定
$data = array(
'column_varchar01' => 'あああ',
'column_int02' => 10,
'column_varchar02' => 'いいい',
);
$mt->set($data);
//保存
if(!$mt->save()){
print "保存失敗";
}else{
print "保存成功";
}
}
「forge()」でインスタンスを作って「set()」で投入用データを設定し
「save()」で実際にDBに保存しています。
次にデータを更新してみるφ(--)
public function action_update()
{
//データ取得
$mt = Model_Test01::find_by_pk(2);
//値設定
$data = array(
'column_varchar01' => 'ううう',
'column_int02' => 11,
'column_varchar02' => 'えええ',
);
$mt->set($data);
//保存
if(!$mt->save()){
print "保存失敗";
}else{
print "保存成功";
}
}
{
//データ取得
$mt = Model_Test01::find_by_pk(2);
//値設定
$data = array(
'column_varchar01' => 'ううう',
'column_int02' => 11,
'column_varchar02' => 'えええ',
);
$mt->set($data);
//保存
if(!$mt->save()){
print "保存失敗";
}else{
print "保存成功";
}
}
「find_by_pk()」で既存データを取得して「set()」で値を上書きして
「save()」で保存(update)しています。
ちなみに既存データを取得しないでこんな書き方をするとφ(--)
public function action_update2()
{
//インスタンス生成
$mt = Model_Test01::forge();
//値設定
$data = array(
'pk_id' => 2,
'column_varchar01' => 'ううう',
'column_int02' => 11,
'column_varchar02' => 'えええ',
);
$mt->set($data);
//保存
if(!$mt->save()){
print "保存失敗";
}else{
print "保存成功";
}
}
{
//インスタンス生成
$mt = Model_Test01::forge();
//値設定
$data = array(
'pk_id' => 2,
'column_varchar01' => 'ううう',
'column_int02' => 11,
'column_varchar02' => 'えええ',
);
$mt->set($data);
//保存
if(!$mt->save()){
print "保存失敗";
}else{
print "保存成功";
}
}
エラーになります。
既存データの有無に寄らずプライマリキー「pk_id=2」の情報で「insert」しようとするみたいです。
fuel/core/classes/model/crud.php
の中を覗いてみたところ、「insert」か「update」の切り分けは
「$_is_new」プロパティでやっているようですね。
そして「$_is_new」プロパティは「is_new()」メソッドで強制的に上書きできるみたいです。
と言う訳で既存データを取得しない場合でも
こんなんしたらupdateになりましたφ(--)
public function action_update3()
{
//インスタンス生成
$mt = Model_Test01::forge();
//値設定
$data = array(
'pk_id' => 2,
'column_varchar01' => 'おおお',
'column_int02' => 11,
'column_varchar02' => 'かかか',
);
$mt->set($data);
//update指定
$mt->is_new(false);
//保存
if(!$mt->save()){
print "保存失敗";
}else{
print "保存成功";
}
}
{
//インスタンス生成
$mt = Model_Test01::forge();
//値設定
$data = array(
'pk_id' => 2,
'column_varchar01' => 'おおお',
'column_int02' => 11,
'column_varchar02' => 'かかか',
);
$mt->set($data);
//update指定
$mt->is_new(false);
//保存
if(!$mt->save()){
print "保存失敗";
}else{
print "保存成功";
}
}
完了\(--)/