(1) 親: 物理削除モデル / 子: 物理削除モデル
(2) 親: 論理削除モデル / 子: 論理削除モデル
(3) 親: 物理削除モデル / 子: 論理削除モデル
(4) 親: 論理削除モデル / 子: 物理削除モデル
初期化用SQLは以下です。各組み合わせの実行前に、このSQLで初期化しました。
-- ----------------------------------------------------- -- Table `parents` -- ----------------------------------------------------- DROP TABLE IF EXISTS `parents` ; CREATE TABLE IF NOT EXISTS `parents` ( `id` INT NOT NULL AUTO_INCREMENT , `name` VARCHAR(255) NOT NULL , `created_at` INT NOT NULL , `updated_at` INT NOT NULL , `deleted_at` INT , PRIMARY KEY (`id`) ) ENGINE = InnoDB; INSERT INTO `parents` (`id`, `name`, `created_at`, `updated_at`) VALUES (1, 'parent1', 1363709961, 1363709961), (2, 'parent2', 1363709961, 1363709961); -- ----------------------------------------------------- -- Table `children` -- ----------------------------------------------------- DROP TABLE IF EXISTS `children` ; CREATE TABLE IF NOT EXISTS `children` ( `id` INT NOT NULL AUTO_INCREMENT , `parent_id` INT NOT NULL , `name` VARCHAR(255) NOT NULL , `created_at` INT NOT NULL , `updated_at` INT NOT NULL , `deleted_at` INT , PRIMARY KEY (`id`) , INDEX `fk_children_parents_idx` (`parent_id` ASC) ) ENGINE = InnoDB; INSERT INTO `children` (`id`, `parent_id`, `name`, `created_at`, `updated_at`) VALUES (1, 1, 'child1', 1363709961, 1363709961), (2, 1, 'child2', 1363709961, 1363709961), (3, 2, 'child3', 1363709961, 1363709961);初期化用SQLに対する検索結果は以下です。
mysql> select * from parents; +----+---------+------------+------------+------------+ | id | name | created_at | updated_at | deleted_at | +----+---------+------------+------------+------------+ | 1 | parent1 | 1363709961 | 1363709961 | NULL | | 2 | parent2 | 1363709961 | 1363709961 | NULL | +----+---------+------------+------------+------------+ 2 rows in set (0.00 sec) mysql> select * from children; +----+-----------+--------+------------+------------+------------+ | id | parent_id | name | created_at | updated_at | deleted_at | +----+-----------+--------+------------+------------+------------+ | 1 | 1 | child1 | 1363709961 | 1363709961 | NULL | | 2 | 1 | child2 | 1363709961 | 1363709961 | NULL | | 3 | 2 | child3 | 1363709961 | 1363709961 | NULL | +----+-----------+--------+------------+------------+------------+ 3 rows in set (0.00 sec)
使用したModelは、それぞれ以下です。
尚、物理削除モデルと論理削除モデルとで異なるのは、継承するクラスとprotected static $_soft_deleteの有無のみです。
親: 物理削除モデル
<?php class Model_Parent extends \Orm\Model { protected static $_properties = array( 'id', 'name', 'deleted_at', 'created_at', 'updated_at', ); protected static $_observers = array( 'Orm\Observer_CreatedAt' => array( 'events' => array('before_insert'), 'mysql_timestamp' => false, ), 'Orm\Observer_UpdatedAt' => array( 'events' => array('before_save'), 'mysql_timestamp' => false, ), ); protected static $_has_many = array( 'comments' => array( 'key_from' => 'id', 'model_to' => 'Model_Child', 'key_to' => 'parent_id', 'cascade_save' => true, 'cascade_delete' => true, ) ); }子: 物理削除モデル
<?php class Model_Child extends \Orm\Model { protected static $_properties = array( 'id', 'parent_id', 'name', 'deleted_at', 'created_at', 'updated_at', ); protected static $_observers = array( 'Orm\Observer_CreatedAt' => array( 'events' => array('before_insert'), 'mysql_timestamp' => false, ), 'Orm\Observer_UpdatedAt' => array( 'events' => array('before_save'), 'mysql_timestamp' => false, ), ); protected static $_belongs_to = array( 'post' => array( 'key_from' => 'parent_id', 'model_to' => 'Model_Parent', 'key_to' => 'id', 'cascade_save' => false, 'cascade_delete' => false, ) ); }親: 論理削除モデル
<?php class Model_Parent extends \Orm\Model_Soft { protected static $_soft_delete = array( 'mysql_timestamp' => false, ); protected static $_properties = array( 'id', 'name', 'deleted_at', 'created_at', 'updated_at', ); protected static $_observers = array( 'Orm\Observer_CreatedAt' => array( 'events' => array('before_insert'), 'mysql_timestamp' => false, ), 'Orm\Observer_UpdatedAt' => array( 'events' => array('before_save'), 'mysql_timestamp' => false, ), ); protected static $_has_many = array( 'comments' => array( 'key_from' => 'id', 'model_to' => 'Model_Child', 'key_to' => 'parent_id', 'cascade_save' => true, 'cascade_delete' => true, ) ); }子: 論理削除モデル
<?php class Model_Child extends \Orm\Model_Soft { protected static $_soft_delete = array( 'mysql_timestamp' => false, ); protected static $_properties = array( 'id', 'parent_id', 'name', 'deleted_at', 'created_at', 'updated_at', ); protected static $_observers = array( 'Orm\Observer_CreatedAt' => array( 'events' => array('before_insert'), 'mysql_timestamp' => false, ), 'Orm\Observer_UpdatedAt' => array( 'events' => array('before_save'), 'mysql_timestamp' => false, ), ); protected static $_belongs_to = array( 'post' => array( 'key_from' => 'parent_id', 'model_to' => 'Model_Parent', 'key_to' => 'id', 'cascade_save' => false, 'cascade_delete' => false, ) ); }
実行に使用したタスクは以下です。
<?php namespace Fuel\Tasks; class Delete { public static function run() { $parent = \Model_Parent::find(1); $parent->delete(); } }
上記タスク実行後の検索結果は、それぞれ以下です。
(1) 親: 物理削除モデル / 子: 物理削除モデル
mysql> select * from parents; +----+---------+------------+------------+------------+ | id | name | created_at | updated_at | deleted_at | +----+---------+------------+------------+------------+ | 2 | parent2 | 1363709961 | 1363709961 | NULL | +----+---------+------------+------------+------------+ 1 row in set (0.00 sec) mysql> select * from children; +----+-----------+--------+------------+------------+------------+ | id | parent_id | name | created_at | updated_at | deleted_at | +----+-----------+--------+------------+------------+------------+ | 3 | 2 | child3 | 1363709961 | 1363709961 | NULL | +----+-----------+--------+------------+------------+------------+ 1 row in set (0.00 sec)(2) 親: 論理削除モデル / 子: 論理削除モデル
mysql> select * from parents; +----+---------+------------+------------+------------+ | id | name | created_at | updated_at | deleted_at | +----+---------+------------+------------+------------+ | 1 | parent1 | 1363709961 | 1363712747 | 1363712747 | | 2 | parent2 | 1363709961 | 1363709961 | NULL | +----+---------+------------+------------+------------+ 2 rows in set (0.00 sec) mysql> select * from children; +----+-----------+--------+------------+------------+------------+ | id | parent_id | name | created_at | updated_at | deleted_at | +----+-----------+--------+------------+------------+------------+ | 1 | 1 | child1 | 1363709961 | 1363712747 | 1363712747 | | 2 | 1 | child2 | 1363709961 | 1363712747 | 1363712747 | | 3 | 2 | child3 | 1363709961 | 1363709961 | NULL | +----+-----------+--------+------------+------------+------------+ 3 rows in set (0.00 sec)(3) 親: 物理削除モデル / 子: 論理削除モデル
mysql> select * from parents; +----+---------+------------+------------+------------+ | id | name | created_at | updated_at | deleted_at | +----+---------+------------+------------+------------+ | 2 | parent2 | 1363709961 | 1363709961 | NULL | +----+---------+------------+------------+------------+ 1 row in set (0.00 sec) mysql> select * from children; +----+-----------+--------+------------+------------+------------+ | id | parent_id | name | created_at | updated_at | deleted_at | +----+-----------+--------+------------+------------+------------+ | 1 | 0 | child1 | 1363709961 | 1363712797 | 1363712797 | | 2 | 0 | child2 | 1363709961 | 1363712797 | 1363712797 | | 3 | 2 | child3 | 1363709961 | 1363709961 | NULL | +----+-----------+--------+------------+------------+------------+ 3 rows in set (0.00 sec)(4) 親: 論理削除モデル / 子: 物理削除モデル
* この組み合わせのみ、エラーが出ました。
Error - Both sides of the relation must be subclasses of Model_Soft if cascade delete is true in PKGPATH/orm/classes/model/soft.php on line 177
No comments:
Post a Comment