2013-01-13 77 views
0

首先來看看下面的模型結構:HABTM與分頁

型號大廈:

id 
name 

型號BuildingRange

id 
building_id 
postalcode 

好了,BuildingRange $ belongsTo Building and Building $ hasMany BuildingRange。應該清楚直到'在這裏。

現在讓

$current_postalcode="12345"; 

我知道想要做這樣的事情在BuildingController

$this->paginate('Building',array('Building.BuildingRange.postalcode'=>$current_postalcode)); 

在文本:我想選擇一個條目「BuildingRange」所有建築物存在$ current_postalcode。你是怎樣做的?

我感謝您的幫助!

回答

1

在處理這種hasMany關聯時,CakePHPs自動魔法需要兩個查詢,一個在Building表中,另一個在BuildingRange表中。當通過pagiante方法傳遞條件時,這些條件將傳遞給第一個查詢,因此它將失敗,因爲關聯的模型表未連接。

這個問題可以在幾個不同的方法來解決,一個將使用的ad-hoc連接,例如:

$this->paginate = array 
(
    'joins' => array 
    (
     array 
     (
      'table' => 'building_ranges', 
      'alias' => 'BuildingRange', 
      'type' => 'LEFT', 
      'conditions' => array('BuildingRange.building_id = Building.id') 
     ) 
    ) 
); 
$this->paginate('Building', array('BuildingRange.postalcode' => $current_postalcode)); 

這將導致一個查詢,看起來像這樣:

SELECT `Building`.`id`, 
     `Building`.`name` 
FROM `buildings` AS `Building` 
     LEFT JOIN `building_ranges` AS `BuildingRange` 
       ON (`BuildingRange`.`building_id` = `Building`.`id`) 
WHERE `BuildingRange`.`postalcode` = '12345' 
LIMIT 20 

注意,在傳遞給paginate方法的條件也沒有必要通過Building模型引用BuildingRange模式,即無需使用Builduing.BuildingRange(即不反正工作)。

ps,總是很好的提及你正在使用的CakePHP版本!

+0

感謝臨時解決方案似乎像一個魅力。我想提一下 - 當然 - 也可以使用BuildingRangeController,然後所有東西都可以在沒有任何額外連接的情況下工作。但我希望控制器能夠「建立」,所以你的解決方案是完美的。 – androidavid