私は自分の codeigniter アプリケーションの ORM に移行しており、 datamapper を選択しました。ただし、ルールセクションでは、次のように述べています。
リレーションシップの種類に関係なく、関連する各通常テーブル間に結合テーブルが存在する必要があります。
1->多の関係にあるテーブルが多数あります。これは、多対多であるかのように、それぞれの間に中間 (結合) テーブルを作成する必要があるということですか?
いいえ、実際には、関係セットを持つモデルには、関係セットを持つオブジェクトを参照する$has_one
フィールドの終わりがあります。_id,
$has_many
たとえば、次のようになります。
class Recipe extends DataMapper {
var $has_many = array('product', 'rating', 'recipe_category');
var $has_one = array('recipe_source', 'user');
(...)
}
class Recipe_Source extends DataMapper {
var $has_many = array('recipe');
(...)
}
この場合、DataMapper は列を含むテーブルrecipes
と、追加のフィールドを必要としないテーブルを作成しました。recipe_source_id
recipe_sources
ここで、多対多の関係の場合、結合テーブルが作成され、厳密な規則に従います。
結合テーブル名は、結合されたモデルの 2 つの複数形をアンダースコアで区切ってアルファベット順に並べたものになります。
したがって、このモデルを使用すると、次のようになります。
class Product extends DataMapper {
var $has_one = array('cheese_style', 'butter_style', 'cheese_flavor');
var $has_many = array('product_size', 'recipe');
(...)
}
これで、データベースに結合テーブルが作成されました。products_recipes.
これは、DMZ DataMapper ライブラリ ( http://www.overzealous.com/dmz/ ) によって処理される方法です。これは、古い stensi DataMapper ライブラリのドロップイン代替となるはずです。規則は同じです。
それでも、DMZ に切り替えることを強くお勧めします。
ドキュメントは、1対多の関係のような単純なものに結合テーブルを使用しないようにするために何をすべきかを1か所で明示的に述べていることはありません。あなたは周りの情報(データベーステーブル、関係の設定、高度な関係)を収集し、ハウツーを示さなくてもそれが可能であることを理解します。
「_id」サフィックス規則を使用して子テーブルに外部キーを作成するだけで、2つのモデルでhas_one属性とhas_many属性を設定したと仮定すると、Datamapperはそれを自動的に認識します(少なくともそれが私にとってはうまくいきました)。この例のcountry_idとして:
// class User extends DataMapper { var $has_one = array('country'); ... }
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`country_id` int(10) unsigned NOT NULL,
`username` varchar(20) NOT NULL,
`password` varchar(50) NOT NULL,
`confirm_password` varchar(50) NOT NULL,
`email` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
)
// class Country extends DataMapper { var $has_many = array('user'); ... }
CREATE TABLE `countries` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
)
はい、残念ながら、それはそれを意味します。これが、DB 設計を変更しなければならなかった理由の 1 つです。