0

我的数据库有与多个城市相关的类别表。在类别表中,城市列具有逗号分隔的 ID,例如 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

如果一个城市只属于一个类别,请使用 hasMany 关系。如果一个城市可以属于多个类别,请使用 HABTM 关系。

我猜你可能想要的是 HABTM 关系。从 categories 表中删除 city 字段,并创建一个额外的 categories_cities 表,其中包含字段 category_id 和 city_id。对于您给出的示例,它应该如下所示:

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

然后将以下内容添加到您的类别模型中:

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

建立关系后,假设模型的递归属性设置为 0 或更高,Cake 会在您为该类别进行查找时自然地获取与该类别相关的城市。(默认情况下,它设置为 1。)或者,您可以使用可包含行为。

于 2013-11-08T07:13:43.390 回答