0

私のデータベースには、複数の都市に関連するカテゴリ テーブルがあります。カテゴリ テーブルの都市列には、1、2、3 などのコンマで区切られた ID があります。

$categoryDetails = $this->Category->find('first',array('conditions'=>array('slug'=> $slug)));

Array
(

[Category] => Array
    (
        [id] => 10
        [parent_id] => 2
        [city] => 2, 3, 4, 5, 6, 7, 8, 9, 10
        [slug] => college
        [type] => 
        [lft] => 31
        [rght] => 32
        [name] => College
        [description] => College


        [image_name] => 1376938860_1185824_431052847008731_328184125_n.jpg
        [created] => 1376938860
        [modified] => 1376938860
    )

)
4

1 に答える 1

1

CakePHP はモデルの関係を処理するように設計されています。あなたがしていることは、Cake が設計されたことを完全に回避することです。さらに、一般的に、ID をカンマ区切りのリストに格納して、別のテーブルのエントリをリンクすることは望ましくありません。 http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html

都市が 1 つのカテゴリにしか属さない場合は、hasMany 関係を使用します。都市が多くのカテゴリに属する​​可能性がある場合は、HABTM 関係を使用します。

おそらくあなたが望んでいるのは HABTM 関係だと思います。カテゴリ テーブルから都市フィールドを削除し、フィールド category_id および city_id を持つ追加のcategories_cities テーブルを作成します。あなたが与えた例では、次のようになります。

 category_id  |  city_id
 10           |  2
 10           |  3
 10           |  4
 10           |  5
 10           |  6
 10           |  7
 10           |  8
 10           |  9
 10           |  10

次に、Category モデルに次を追加します。

 public $hasAndBelongsToMany = array(
    'City' =>
        array(
            'className' => 'City',
            'joinTable' => 'categories_cities',
            'foreignKey' => 'city_id',
            'associationForeignKey' => 'category_id',
            'unique' => true,
        )
);

リレーションシップを設定すると、モデルの再帰プロパティが 0 以上に設定されている場合、Cake はそのカテゴリの検索を行うときに、そのカテゴリに関連付けられた都市を自然に取得します。(デフォルトでは、1 に設定されています。) または、containable 動作を使用できます。

于 2013-11-08T07:13:43.390 に答える