爲什麼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
/馬頓
我同意你的看法,CakePHP並不總是生成有效的查詢。不過,我想知道其他ORM框架是否更好。最後,分析生成的SQL語句以及(如果需要的話)嘗試優化它們是一種很好的做法(如您所做的那樣)。我特別提到*如果需要*,因爲有時候這取決於執行查詢的頻率以及優化是至關重要的。對於非常複雜的關係,可以使用自定義(原始SQL)查詢,但只能作爲最後的手段。 – thaJeztah 2013-03-15 22:36:37
在這些情況下,一個更清潔的解決方案是將您的(複雜)查詢包裝在「數據庫視圖」(「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