2011-05-16 84 views
4

我試圖讓ID列表(一拉find('list'))名單,但無法弄清楚如何與相關模型的條件做。CakePHP中找到相關模型的條件

我的聯繫是: Product hasAndBelongsToMany Category Product belongsTo Manufacturer

我想找到的是分類ID列表,並有一定的製造商seo_url產品ID列表。我已經嘗試過大量的包含條件,引用其他模型的條件,甚至嘗試使用find('all')來查看我的條件是否可行,但是什麼也得不到。

我設法得到一個與產品展示 - >查詢(),但它不是以列表的形式。我可以在數組中循環並獲取ID或其他內容,但感覺非常不合適。我想確保Cake仍然對我的查詢執行所有的安全檢查,以及其他任何automagic。下面是我得到了工作查詢:

$all_results = $return['Category']['all_results'] = $this->Product->query(' 
    SELECT `Product`.`id` 
     FROM `categories_products` as `CategoriesProduct` 
     JOIN `products` as `Product` ON (`CategoriesProduct`.`product_id` = `Product`.`id`) 
     JOIN `manufacturers` as `Manufacturer` ON (`Product`.`manufacturer_id` = `Manufacturer`.`id` AND `Manufacturer`.`seo_url` = \''.$manufacturer.'\') 
     WHERE `CategoriesProduct`.`category_id` IN ('.implode(',', $search_categories).') 
'); 

這將返回

[all_results] => Array 
    (
     [0] => Array 
      (
       [Product] => Array 
        (
         [id] => 101787 
        ) 

      ) 

     [1] => Array 
      (
       [Product] => Array 
        (
         [id] => 100781 
        ) 

      ) 

     [2] => Array 
      (
       [Product] => Array 
        (
         [id] => 101887 
        ) 

      ) 

     [3] => Array 
      (
       [Product] => Array 
        (
         [id] => 101888 
        ) 

      ) 

    ) 

注:$search_categories是列表類的ID(即:array(12,42,24,5)

+0

確實非常不可靠。 – 2011-05-16 21:00:24

回答

3

與你想要的結果的問題是,蛋糕不會,如果您使用您的相關模型的條件給你回剝離結果數組。

這是因爲蛋糕將只使用您的相關模型,這些條件給你回的結果與條件是你的相關車型如此。

如果你想回來的產品只需要通過類別,型號來查詢,因爲這讓你使用你的產品的可能性條件的特定類別。這可能看起來像這樣:

$this->Category->find('all', array('conditions' => array('Category.id' => 2)); 

這會讓你回來只想要的類別及其相關產品。 但是,如果您想要一個列表,這不是很令人滿意,因爲您必須手動進行轉換。

我寧願看看Linkable Plugin,它應該給你正是你想要的功能,因爲它在你的查詢中使用連接來擴展Cake。這樣可以在您的相關型號上獲得條件結果。

+0

我決定手動將查找數組轉換爲列表。只需要3行代碼,所以它不是太糟糕。 Linkable插件看起來很有趣,但我對插件沒有多少經驗。感謝您的幫助 – Rob 2011-05-21 17:34:39

+0

Rob,您是否可以將「3行代碼」添加到您的問題中,以便我也可以用相同的方式轉換我的代碼? – bowlerae 2013-02-28 18:17:59

+0

$ ids = array(); $ i = 0; foreach($ all_results as $ result){ $ ids [$ i] = $ result ['id']; $ i ++; } 也許有點晚,但是這段代碼工作:) – Victor 2014-03-31 21:30:45

3

CakePHP的可以古怪conditions相關車型。特別是與HABTM的關係。即使當recursive被設置爲最高值(即2)時。查看關於HABTM的更多細節的文檔。

請嘗試以下操作。雖然從上面的,我不認爲它會工作:

$conditions = array('Category.id' => $category_ids, 'Manufacturer.seo_url' => $manufacturer); 
$this->Product('list', array('recursive' => 1, 'conditions' => $conditions)); 

此外,避免query()只要有可能。 MVC整點是從顯示邏輯絕緣數據。使用諸如query()之類的東西只是打破了這一點。

+0

是的,這就是爲什麼我想弄清楚如何將該查詢轉換爲Cake。我嘗試使用遞歸,嘗試使用包含=>數組(製造商=>數組(條件=>數組()))等 – Rob 2011-05-16 21:12:59