[英]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.