【问题标题】:CakePHP join with comma separated idsCakePHP 以逗号分隔的 id 加入
【发布时间】:2014-03-13 07:44:41
【问题描述】:

这里我想加入两个用逗号分隔的表

例如我的数据是这样的:

[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 的类别数据。

【问题讨论】:

    标签: php mysql cakephp join


    【解决方案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: Restaurant hasAndBelongsToMany Categoryy。

    餐厅 餐厅类别 类别

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

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

    这个我没测试过,自己试试看,见FIND_IN_SET() vs IN()

    您必须有另一种方法来获取您之前想要的所有 id。就像我说的,这是无效且糟糕的设计。

    【讨论】:

    • 感谢您对数据库设计的建议 :),但不能使用您的第二个解决方案 b'coz 如果我们以这种方式添加条件将在查询中添加如下:** LEFT JOIN @987654326 @.category AS Category ON (Restaurant.RST_CAT_ID = Category.CAT_ID AND Category.CAT_ID IN (Restaurant.RST_CAT_ID)) >
    • 您的查询未显示 FIND_IN_SET。将关联中的 FK 设置为 false 并将连接条件添加到条件数组中。您为什么不直接修复您的数据库设计,而不是处理不良数据库设计的症状?
    • 你是对的 burzum,但在这个阶段不能重新设计数据库,它已经上线的项目和旧的一个。
    【解决方案2】:

    您必须将外键设置为 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'的地方传递一个数组

    【讨论】:

    • 'conditions' => array('FIND_IN_SET(Category.CAT_ID,Restaurant.RST_CAT_ID)'),导致我出错,因为 find_in_set 接收到 2 个参数并且我们传递了超过 2 个('FIND_IN_SET( Category.CAT_ID,2,4)') 所以它抛出错误。所以你能给我一些建议吗@chirag
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多