2014-02-17 68 views
0

我有一個表items和一個表item_pics表。包含單個項目從相關表

item_pics具有item_id,file_namerank字段(等等)。


我正在尋找是每個itemindex頁的$items陣列包含從item_pics匹配itemitem_id具有最低rankfile_name。所以,我可以像訪問(或東西等)這在我Items/index.ctp

foreach ($items as $item): 
    $img = $item['Item']['ItemPic']['file_name']; 
    ... 

我是很新,CakePHP的,這是我的第一個項目。我認爲這將Item模型中會導致item_pics數據被拉到(雖然我想通每個item所有相關item_pics會被拉進去,而不僅僅是一個具有最低rank):

public $hasMany = array(
    'ItemPic' => array(
     'className' => 'ItemPic', 
     'foreignKey' => 'item_id', 
     'dependent' => false 
    ) 
} 

但我可以看到沒有item_pics數據被加載(在items/index底部):

SELECT `Item`.`id`, `Item`.`title`, `Item`.`description`, `Item`.`created`, `Item`.`modified`, `Item`.`type`, `Project`.`id`, `Project`.`item_id`, `Project`.`title`, `Project`.`description`, `Project`.`rank`, `Project`.`created`, `Project`.`modified` 
FROM `laurensabc`.`items` AS `Item` 
LEFT JOIN `laurensabc`.`projects` 
AS `Project` 
ON (`Project`.`item_id` = `Item`.`id`) 
WHERE `Item`.`type` IN (1, 2) 
LIMIT 20 

還,而我想projectsview頁面中加入了,我並不真的需要他們在index頁面。

我已經做了一些搜索,一直沒能找到我正在尋找什麼。我想我可以在index視圖項目循環中做一個查詢,但我試圖確保我以正確的方式執行... CakePHP方式。我想我需要改變一些關於我的模型關係的事情,但我沒有運氣。

CakePHP - Associations - HasMany,這使得它看起來像我可以通過職級和限制1.訂購但這並沒有工作...即使它沒有,我不希望這樣的影響view頁面,而是隻index頁面。

我的控制器看起來是這樣的:

public function index($type = null) { 
    $this->Item->recursive = 0; 
    $conditions = array(); 
    if ($type == "sale") { 
     $conditions = array(
       "Item.type" => array(self::FOR_SALE, self::FOR_SALE_OR_RENT) 
     ); 
    } else if ($type == "rent") { 
     $conditions = array(
       "Item.type" => array(self::FOR_RENT, self::FOR_SALE_OR_RENT) 
     ); 
    } else { 
     $conditions = array("Item.type !=" => self::HIDDEN); 
    } 
    $paginated = $this->Paginator->paginate($conditions); 
    debug($paginated); 
    $this->set('items', $paginated); 
    $this->set('title', ($type == null ? "Items for Sale or Rent" : "Items for " . ucwords($type))); 
} 

我自己也嘗試這是我的控制器上,但它似乎並不要麼做任何事情:

​​

回答

1

首先,在AppModel設置containable行爲(或者,如果你不希望它在每一個模型,把它放在Item模型):

public $actsAs = array('Containable'); 

然後,在您的查找查詢:

$items = $this->Item->find('all', array(
    'contain' => array(
     'ItemPic' => array(
      'fields' => array('file_name'), 
      'order' => 'rank', 
      'limit' => 1 
     ) 
    ) 
)); 

那麼結果數組,你可以訪問它想:

foreach ($items as $item): 
    $img = $item['ItemPic']['file_name']; 

編輯:那麼你應該把它放在PAGINATE查詢:

$this->paginate = array(
    'conditions' => $conditions, 
    'contain' => array(
     'ItemPic' => array(
      'fields' => array('file_name'), 
      'order' => 'rank', 
      'limit' => 1 
     ) 
    ) 
); 
+0

我沒有查詢查詢,我會在哪裏放置? – smerny

+0

哦,沒有看到。那麼你應該把它放在你的'$ this-> paginate'上,儘管我不是100%確定的,因爲'paginate'與find查詢不一樣,我也沒有太多地使用它。但無論如何嘗試。看看我的編輯。 – Eagle

+0

似乎工作,雖然它在'$ item ['ItemPic'] [0] ['file_name']'。我將不得不更多關注這個「可容納的」功能......但同時,你知道使用它有什麼不利嗎? – smerny

0

在這種情況下,我會可能按排名順序排列並按照您的說法限制1,然後僅爲索引頁創建動態關聯(請參閱http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#creating-and-destroying-associations-on-the-fly)。因此,使用$this->Item->bindModel(array('hasMany' => array('ItemPic' => $options)));(我認爲應該更換你的當前設置的hasMany ItemPic,但你可能要unbindmodel第一)通過bindModel創建將通過爲下一個查詢

協會只,那麼它會恢復到正常的設置,除非你專門設置了一個選項來繼續使用新的關聯。

至於爲什麼它沒有獲得ItemPics的項目,或者爲什麼試圖按排名和限制排序1沒有爲你工作,我不能沒有看到更多的代碼。

+0

我已經添加了我的控制器代碼'index',還有什麼你想看看嗎? – smerny

相關問題