将php列表数据及其相关值转换为逗号删除的id

将php列表数据及其相关值转换为逗号删除的id,php,mysql,cakephp,Php,Mysql,Cakephp,我的数据库具有与多个城市相关的类别表。在categories表中,city列具有逗号分隔的id,例如1、2、3。 从categories表检索数据时,我希望city列包含相应的城市名称,而不是城市id $categoryDetails = $this->Category->find('first',array('conditions'=>array('slug'=> $slug))); Array ( [Category] => Array (

我的数据库具有与多个城市相关的类别表。在categories表中,city列具有逗号分隔的id,例如1、2、3。 从categories表检索数据时,我希望city列包含相应的城市名称,而不是城市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
    )

)

CakePHP是为处理模型关系而设计的,您所做的是完全绕过Cake的设计目的。此外,通常不希望通过将ID存储在逗号分隔的列表中来链接单独表中的条目

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

我猜你可能想要的是HABTM的关系。从categories(类别)表中删除city(城市)字段,并创建一个具有字段category(类别)id和city(城市)id的其他categories(城市)表。对于您给出的示例,它应该如下所示:

 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,
        )
);

一旦您建立了关系,当您为该类别进行查找时,Cake自然会获取与该类别相关的城市,假设模型的递归属性设置为0或更高。(默认设置为1。)或者,您可以使用containable行为。

感谢Kai提供的解决方案,它很好,而且肯定会很好地工作。但问题是,我有更多的数据,像这样的城市,如优惠,事件,服务,业务等。这样的数据库将是太大,我必须改变整个数据库,因为管理员准备使用只有前线我必须工作。如果可能的话,请给出任何其他想法。更改数据库不应使其变得太大。编写脚本将现有数据转换为不同的模式也应该相当容易。这样一来,您的数据库就很容易出现问题,除非您非常非常小心地维护完整性,例如,如果您删除了一个城市,您必须检查所有类别,确保它们不再位于城市字段中。如果你真的必须保持这种方式,你将不得不做一个手动查找每个城市在外地。但我真的不推荐它。