私のデータベーススキーマ:
CREATE TABLE IF NOT EXISTS `costumers` (
`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`person_id` smallint(5) unsigned NOT NULL,
`status` tinyint(1) unsigned NOT NULL DEFAULT 1,
PRIMARY KEY (`id`),
KEY `fk_costumers_persons_idx` (`person_id`)
);
CREATE TABLE IF NOT EXISTS `persons` (
`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(64) NOT NULL,
`phone` char(10) DEFAULT NULL,
`mobile` char(10) DEFAULT NULL,
`email` varchar(64) NOT NULL,
`date_created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`data_updated` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
);
これが私のコントローラーコードです:
class Test extends CI_Controller {
public function index()
{
// Faking POST values
$_POST = array(
// Person info
'name' => 'Paulo Freitas',
'phone' => 'xxxxxxxxxx',
'email' => 'xx@xxxxxxxxxxxx.xx',
// Costumer info
'status' => 2
);
// Utility function
function factory_from($class, $fields)
{
$CI =& get_instance();
$input = array();
foreach ($fields as $field) {
$input[$field] = $CI->input->post($field) ?: null;
}
$obj = new $class;
$obj->from_array($input);
return $obj;
}
// Save person
$person = factory_from('Person', array(
'name',
'phone',
'mobile',
'email'
));
$person->save();
// Save costumer
$costumer = factory_from('Costumer', array(
'status'
));
$costumer->save($person);
var_dump($costumer->id); // New costumer id
}
}
私は CodeIgniter の DataMapper ORM を初めて使用し、関連するコスチュームを正常に保存した場合にのみ人を確実に保存する方法について少し迷っています。たとえば、貸衣装を検証しstatus
て失敗した場合、その貸衣装を保存するには、以前はその関連人物を保存する必要がありました...貸衣装を保存できない場合、新しい人をロールバックするにはどうすればよいですか? (実際のシナリオでは、、、およびテーブルがありpersons
、すべてが成功した場合にのみそれらを保存する必要があります)individuals
users
costumers
ここでトランザクションを使用するにはどうすればよいですか? ええ、私はすでにトランザクションの使用に関するドキュメントを読んでいますが、理解できず、数時間それで立ち往生しています。前もって感謝します!
アップデート
コントローラーを少しハッキングしたところ、動作するようになりました。これを達成するためのより良い方法はありますか?
新しいコントローラー:
class Test extends CI_Controller {
public function index()
{
// Faking POST values
$_POST = array(
// Person info
'name' => 'Paulo Freitas',
'phone' => 'xxxxxxxxxx',
'email' => 'xx@xxxxxxxxxxxx.xx',
// Costumer info
'status' => 2
);
// Utility functions
function factory_from($class, $fields)
{
$CI =& get_instance();
$input = array();
foreach ($fields as $field) {
$input[$field] = $CI->input->post($field) ?: null;
}
$obj = new $class;
$obj->from_array($input);
return $obj;
}
function get_errors()
{
$errors = array();
foreach (func_get_args() as $obj) {
$errors += $obj->error->all;
}
return $errors;
}
// Initialize person
$person = factory_from('Person', array(
'name',
'phone',
'mobile',
'email'
));
// Initialize costumer
$costumer = factory_from('Costumer', array(
'status'
));
// Start transaction
$person->trans_begin();
if ($person->save()
&& $costumer->save($person)) {
// If we can save all data, commit!
$person->trans_commit();
// Dump new costumer id
var_dump($costumer->id);
} else {
// Otherwise, rollback all!
$person->trans_rollback();
// Dump all errors
var_dump(get_errors($person, $costumer));
}
}
}