2010-11-23 84 views
0

Tl; Dr:如何創建一個數組;來自兩張桌子;與hasMany和belongsTo聯合;通過;與CakePHP;最佳。加入表CakePHP belongsTo,hasMany

編輯:從(http://book.cakephp.org/view/872/Joining-tables)這是我試圖學習如何做,雖然它說「hasOne」,而不是hasMany ...

「在CakePHP中,一些關聯(belongsTo和hasOne)執行自動連接來檢索數據,因此您可以根據相關數據中的數據發出查詢來檢索模型。」

我試圖通過一個數組,將理想地包含來自兩個表具有hasMany和belongsTo關係的數據。我知道,CakePHP有功能內置的以使這個非常簡單的,想使用它:

  1. 遊的hasMany腿
  2. 腿屬於關聯車次

所以,我想使包含數組來自兩個表的數據,以便我可以輕鬆地在視圖中顯示數據。請注意,加入包含查找參數的數組中沒有任何內容。我認爲CakePHP在創建關聯時加入表格;我只是不確定如何在創建數組時訪問這些關聯。

(我已經花了幾個小時了,找不到如何在網上或書本上做的例子,所以感謝您的幫助)。我可以解決這個問題(通過創建一個單獨的數組並且有一個更復雜的視圖文件),但我剛開始學習編程,並希望在某種程度上做到最佳並使用CakePHP的功能。

在此先感謝您的幫助!我不正確的是,通過這些關聯(belongsTo和hasMany),我不必在controller/find()中顯式聲明連接?現在,我可能會嘗試手動讓連接看看會發生什麼。

現有代碼(這工作正常):

trips_controllers:

function view() { 
    if(empty($this->data)){ 
     $this->Session->setFlash('You forgot to put stuff in the form fields!'); 
     $this->redirect(array('action'=>'index')); 
    } 
    $price=$this->data['Trip']['price']; 
    $origin=$this->data['Trip']['origin_airport']; 
    $this->set('trips', $this->Trip->find('all', array('conditions'=>array('Trip.price <='=>$price, 'Trip.origin_airport'=>$origin), 'limit'=>30, 'recursive=>2'))); 

觀點:

再次
<th>Trip ID</th> 
      <th>Price</th> 
      <th>Origin</th 
      </tr> 
      <? foreach($trips as $trip):?> 
      <tr> 
       <td><?=$trip['Trip']['trip_id'];?></td> 
       <td><?=$html->link($trip['Trip']['url']);  ?> 
       <td><?=$trip['Trip']['origin_airport'];?></td> 
       <td><?=$trip['Trip']['price'];?></td>    
       </tr> 
       <? endforeach;?> 

謝謝!

+0

您能澄清一下當前``trip`數組中你從標準的`find`調用中遇到什麼問題,以及爲什麼你不能按照你想要的方式循環? – deceze 2010-11-23 23:43:03

+0

Thanks Deceze。您的評論讓我覺得他們現在應該可以訪問了。如果第二個表的數據在那裏,那麼我將如何在foreach中訪問它們?當我等待您的回覆時,我會嘗試$ trip ['2ndtablename'] ['fieldname']。 – JohnAllen 2010-11-24 00:12:41

回答

1

如果旅行的hasMany腿,你應該能夠遍歷像這樣的數據:

foreach ($trips as $trip) { 
    echo $trip['Trip']['id']; 
    … 
    foreach ($trip['Leg'] as $leg) { 
     echo $leg['id']; 
     … 
    } 
} 

debug($trips)是你的朋友。默認的Cake數據數組佈局非常明智。儘量習慣它,應用程序很少需要在99.99%的應用程序中修改結構。相反,要保持它在任何地方都是一致的,這是一個很好的例子。