1

私は自分の codeigniter アプリケーションの ORM に移行しており、 datamapper を選択しました。ただし、ルールセクションでは、次のように述べています。

リレーションシップの種類に関係なく、関連する各通常テーブル間に結合テーブルが存在する必要があります。

1->多の関係にあるテーブルが多数あります。これは、多対多であるかのように、それぞれの間に中間 (結合) テーブルを作成する必要があるということですか?

4

3 に答える 3

2

いいえ、実際には、関係セットを持つモデルには、関係セットを持つオブジェクトを参照する$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_idrecipe_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 に切り替えることを強くお勧めします。

于 2010-06-14T16:04:48.220 に答える
1

ドキュメントは、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`)
)
于 2012-01-27T08:30:41.817 に答える
0

はい、残念ながら、それはそれを意味します。これが、DB 設計を変更しなければならなかった理由の 1 つです。

于 2010-02-26T08:54:59.177 に答える