2013-03-13 145 views
0

爲什麼CakePHP不包含我所有的關聯到一個SQL查詢?我能做到這一點的唯一方法就是使用「連接」,但我希望屬於To和Containable行爲就夠了。CakePHP中的多級排序

下面是一個例子: 後> belongsTo->類別 - > belongsTo-> category_type (所有型號都安裝正確和工作

上市的帖子在指數分頁,我試試這個:

public function index() { 
    $this->paginate = array('contain' => array('Category' => array('CategoryType'))); 
    $this->set('posts', $this->paginate()); 
} 

這正確獲取數組,但它確實是在許多SQLS這樣的:

SELECT `Post`.`id`, `Post`.`name`, `Post`.`content`, `Post`.`category_id`, `Category`.`id`, `Category`.`name`, `Category`.`category_type_id` FROM `unit_app`.`post` AS `Post` LEFT JOIN `unit_app`.`categories` AS `Category` ON (`Post`.`category_id` = `Category`.`id`) WHERE 1 = 1 LIMIT 20 
SELECT `CategoryType`.`id`, `CategoryType`.`name` FROM `unit_app`.`category_types` AS `CategoryType` WHERE `CategoryType`.`id` = 1 
SELECT `CategoryType`.`id`, `CategoryType`.`name` FROM `unit_app`.`category_types` AS `CategoryType` WHERE `CategoryType`.`id` = 2 
SELECT `CategoryType`.`id`, `CategoryType`.`name` FROM `unit_app`.`category_types` AS `CategoryType` WHERE `CategoryType`.`id` = 2 

這使得DIFF難以在CategoryType.name ASC上訂購此查詢。 有什麼建議嗎?

如果連接只是選項,我必須在查詢之前解除綁定模型嗎? 分頁工作可以與連接正常工作嗎?

注意!這只是所有模型的一小部分,所得到的post-> index需要通過類似的關聯來獲取許多其他模型。

UPDATE(蛋糕上2.2.0和V2.4.0-dev的,PHP v5.4.11測試)! ---------

我只是想展示我的發現。我現在已經解決了這個問題,但沒有連接,但我必須在模型中重新綁定才能使其工作。

這基本上就是我沒有得到它的工作(也paginations和排序): 在Post模型: 增加了綁定功能:

$this->unbindModel(array(
    'belongsTo' => array('Category') 
)); 

    $this->bindModel(array(
    'hasOne' => array(
     'Category' => array(
     'foreignKey' => false, 
     'conditions' => array('Category.id = Post.category_id') 
    ), 
    'CategoryType' => array(
     'foreignKey' => false, 
     'conditions' => array('CategoryType.id = Category.category_type_id') 
    )))); 

然後我說這個我在帖子指數控制器:

$this->Post->bindCategory(); 
    $this->paginate = array('contain' => array('Category' ,'CategoryType')); 
    $this->set('posts', $this->paginate()); 

我有表頭也只是文檔:

<th><?php echo $this->Paginator->sort('CategoryType.name', 'Type'); ?></th> 
<th><?php echo $this->Paginator->sort('Category.name', 'Category'); ?></th> 

我希望這篇文章能夠幫助他人以及:)

,我也要去測試這種行爲,看看我是否可以省略所有綁定,功能,以及:https://github.com/siran/linkable/

有很多插件來蛋糕,但蛋糕應該有一個插件的「認證」。這是相當困難的在github :)

我也錯過這樣的網站railscasts.com只是蛋糕上的全面工作和測試的:d

/馬頓

+0

我同意你的看法,CakePHP並不總是生成有效的查詢。不過,我想知道其他ORM框架是否更好。最後,分析生成的SQL語句以及(如果需要的話)嘗試優化它們是一種很好的做法(如您所做的那樣)。我特別提到*如果需要*,因爲有時候這取決於執行查詢的頻率以及優化是至關重要的。對於非常複雜的關係,可以使用自定義(原始SQL)查詢,但只能作爲最後的手段。 – thaJeztah 2013-03-15 22:36:37

+0

在這些情況下,一個更清潔的解決方案是將您的(複雜)查詢包裝在「數據庫視圖」(「CREATE VIEW post_with_category AS ...」)中,並將其用作模型的數據庫源,這樣您的CakePHP模型可以保持簡單,數據庫視圖將充當'抽象層'。http://dev.mysql.com/doc/refman/5.0/en/create-view.html IMO嘗試儘可能使用CakePHP查詢,如果事情變得如此複雜以至於只會讓你的代碼更難以理解和維護,你必須自己動手使用它們。 – thaJeztah 2013-03-15 22:43:11

回答

0

是的,你必須使用的JOIN能夠根據相關模型結果進行訂購。

是的,你可以與JOIN分頁。在實際撥打$this->paginate();之前,請將您的選項(包括JOIN)傳遞給您的分頁。(網上有很多關於如何與JOIN分頁的資源)

+0

感謝您的快速回復..我真的很喜歡我的控制器儘可能幹,所以我需要把這個進入模型,我不明白爲什麼蛋糕不會自動計算出來,但我認爲這是有幾個原因:) – Mart0n 2013-03-13 18:17:09

+0

@ Mart0n - Np。無論如何,任何/所有相關的查詢都應該在你的模型中。就我個人而言,我寧願他們按照原樣進行查詢,並在需要時允許我加入。我經常會包含8-10個其他模型,並且做一個JOIN(s)並不理想。 – Dave 2013-03-13 19:47:45

+0

嗨@Dave,不知道你的意思。我知道模型相關的東西應該留在模型中。如果我想分頁排序工作,加入或重新綁定似乎只在蛋糕 – Mart0n 2013-03-13 20:16:02