簡體   English   中英

CakePHP使用逗號分隔的ID加入

[英]CakePHP join with comma separated ids

在這里我想用逗號分隔的ID將兩個表連接起來

例如我的數據是這樣的:

[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。

首先看看這個問題: MySQL搜索逗號列表

如您所見,belongsTo查詢只是在單個id上生成聯接,默認情況下CakePHP不遵守這種特殊情況。 您將不得不更改查詢並手動傳遞所有id, 但是您的數據庫設計很糟糕, 並且根本不遵循CakePHP約定

  • 如何防止重復(這會浪費空間)
  • 如何刪除給定值(需要自定義功能,導致出現錯誤的可能性?
  • 隨着表的大小增加,您如何應對性能問題?

而不是更改查詢,您應該更改此笨拙的數據庫設計。 您要在此處使用 HABTM 聯接 :餐廳hasAndBelongsToMany Categoryy。

餐廳<-> restaurant_categories <->類別

如果您堅持使用這種不良的數據庫設計,則必須使用bindModel()並手動設置條件:

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

我尚未測試過,請自己嘗試,請參閱FIND_IN_SET()vs IN()

您將必須有另一種方法來獲取您之前想要的所有ID。 就像我說的那樣,這是無效的並且是不良的設計。

您必須將外鍵設置為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”的位置傳遞一個數組

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM