CakePHP以逗号分隔的id加入

时间:2014-03-13 07:44:41

标签: php mysql cakephp join

这里我想用逗号分隔的ids

加入两个表

例如我的数据如下:

[Restaurant] => Array
(
    [RST_ID] => 171
    [RST_NAME] => oneone
    [RST_IMAGE] => 
    [RST_CAT_ID] => 2,4,6
    [RST_CT_ID] => 27
    [RST_IS_TOP] => 3
    [RST_QR_CODE] => 
    [RST_CREATED_DATE] => 1394536725
    [RST_MODIFIED_DATE] => 1394536725
    [RST_STATUS] => 1
)

[Category] => Array
(
    [CAT_ID] => 2
    [CAT_NAME] => Vegetarian
    [CAT_CREATED_DATE] => 1375175962
    [CAT_MODIFIED_DATE] => 1375175962
    [CAT_STATUS] => 1
)

我的型号代码:

 var $belongsTo = array(
        'Category' => array(
           'className' => 'Category',
           'foreignKey' => 'RST_CAT_ID',
           'conditions' => array('Category.CAT_ID IN ( Restaurant.RST_CAT_ID)')
        )
);

真实查询:

SELECT 
  `Restaurant`.`RST_ID`, `Restaurant`.`RST_NAME`, `Restaurant`.`RST_IMAGE`,
  `Restaurant`.`RST_CAT_ID`, `Restaurant`.`RST_CT_ID`, `Restaurant`.`RST_IS_TOP`,
  `Restaurant`.`RST_QR_CODE`, `Restaurant`.`RST_CREATED_DATE`,
  `Restaurant`.`RST_MODIFIED_DATE`, `Restaurant`.`RST_STATUS`, 
  `Category`.`CAT_ID`, `Category`.`CAT_NAME`, `Category`.`CAT_CREATED_DATE`,
  `Category`.`CAT_MODIFIED_DATE`, `Category`.`CAT_STATUS`, `City`.`CT_ID`,
  `City`.`CT_NAME`, `City`.`CT_CREATED_DATE`, `City`.`CT_MODIFIED_DATE`,
  `City`.`CT_STATUS` 
FROM `dailybit_dailybites`.`restaurant` AS `Restaurant`
LEFT JOIN `dailybit_dailybites`.`category` AS `Category` 
       ON (`Restaurant`.`RST_CAT_ID` = `Category`.`CAT_ID` 
           AND `Category`.`CAT_ID` IN ( `Restaurant`.`RST_CAT_ID`))
LEFT JOIN `dailybit_dailybites`.`city` AS `City` 
       ON (`Restaurant`.`RST_CT_ID` = `City`.`CT_ID`)  
WHERE 1 = 1

那么解决方案是什么?

它只给我一个类别数据,仅限于第一个ID。

2 个答案:

答案 0 :(得分:1)

首先看一下这个问题:MySQL search in comma list

正如您所看到的,belongsTo查询只是在单个id上生成连接,默认情况下CakePHP不尊重这种特殊情况。您必须手动更改查询并传递所有ID,您的数据库设计很糟糕且it doesn't follow the CakePHP conventions完全没有。

  • 如何防止重复(会浪费空间)
  • 如何删除给定值(需要自定义函数,导致错误的可能性?
  • 当表格大小增加时,您如何回应性能问题?

您应该更改此笨拙的数据库设计,而不是更改查询。 You want to use HABTM here and a join table:餐厅有和贝隆到多个类别。

  

餐馆< - > restaurants_categories< - >类

如果你坚持使用这种糟糕的数据库设计,你必须使用bindModel()并手动设置条件:

'conditions' => array('FIND_IN_SET (Category.CAT_ID, ' . $listOfIds. ')')

我没有对此进行测试,请亲自尝试,请参阅FIND_IN_SET() vs IN()

您必须拥有另一种方法,可以在此之前为您提供所需的所有ID。就像我说的,这是无效和糟糕的设计。

答案 1 :(得分:0)

您必须设置外键false和find_in_set条件

 var $belongsTo = array(
        'Category' => array(
           'className' => 'Category',
           'foreignKey' => false,
           'conditions' => array('FIND_IN_SET(Category.CAT_ID,Restaurant.RST_CAT_ID)')
        )
); 

//您可以在' Restaurant.RST_CAT_ID'

的地方传递数组