2011-04-15 45 views
0

我有一個Post模型檢索數據,hasManyPostField
每一個崗位可以存儲在post_fields表中的幾個字段..試圖使一個過濾器,以相關模型

post_fields具有這樣的結構:(id, post_id, name, value)

posts表對所有職位一些常見的領域,但是任何附加字段應存放在post_fields表..

我創建了一個用於過濾的職位

posts表中的字段指定過濾器時,它工作正常..
搜索形式,但我想使過濾器甚至上發現的其他領域合作在post_fields ..

我可以先檢索帖子然後手動過濾它們,但我想要更有效率的東西!

:讓我們假設帖子所描述的一些產品..

post (id, title, created, price) 
post_fields (id, post_id, name, value) 
在這種情況下

,所有職位都有titlecreatedprice ..
但如果後(ID = 3)希望有一個weight領域,我們應該做的是通過創建post_fields記錄,記錄應該是:

{ id: .. , post_id: 3, name: weight, value: .. } 

現在很容易根據price(例如之間的價格min & max)..
但是,如果我想根據weight過濾帖子?
例如我想所有有weight大於10的帖子!

我想在一個查詢中使用連接可能或子查詢來實現此目的。
我不知道如何在cakePHP中做到這一點,所以如果任何人有想法,請幫助!

即使有人只是有一個想法,但沒有詳細說明,可以幫助...

thanx提前!

回答

0

您應該考慮使用模型的Containable行爲。這樣,您可以根據需要篩選返回的列。 (我認爲這是你想要做的過濾類型)

+0

我剛剛完成了根據您的建議閱讀'Containable',但它不是我要找的.. 我會盡快給個例子,以使其更清晰.. – 2011-04-15 05:16:28

2

沒有辦法針對hasMany關係的孩子進行搜索。您需要對PostFields模型運行查詢。即:$this->PostField->find('all', array('conditions'=>array('PostField.name' => 'weight', 'PostField.value' > 10)));

如果您想要同時對PostField和Post模型執行查詢(即:價格< $ 1.00和weight> 10,則需要執行自定義查詢,因爲CakePHP沒有構建在這樣做TMK的解決方案。應該是這個樣子:

$query = "SELECT ... FROM posts as Post, post_fields as PostField WHERE PostField.name = 'weight' AND PostField.value > 10 AND POST.price < 1.0 AND PostField.post_id = Post.id;" 
$posts = $this->Post->query($query); 

編輯: 我會做到這一點。你不會打一個電話,但這仍然是一個乾淨的解決方案。

$postIds = null; 
if(/*we need to run query against PostFields*/) { 
    $conditions = array(
     'OR' => array(
      array(
       'AND' => array(
        'PostField.name' => 'weight', 
        'PostField.value' > 10 
       ) 
      ), 
      array(
       'AND' => array(
        'PostField.name' => 'height', 
        'PostField.value' < 10 
       ) 
      ) 
     ) 
    ); 
    $fields = array('PostField.id', 'PostField.post_id'); 
    $postIds = $this->Post->PostField->find('list', array('conditions'=>$conditions, 'fields'=>$fields)); 
} 
$conditions = array('Post.price' < 1.0); 
if($postIds) { 
    $conditions['Post.id'] = $postIds; 
} 
$posts = $this->Post->find('all', array('conditions'=>$conditions)); 
+0

使用自定義查詢是我的B計劃..但我不喜歡使用原始SQL,因此我使用了CakePHP的子查詢:[here](http://book.cakephp.org/view/1030/Complex-Find-Conditions).. – 2011-04-15 15:02:13

+0

但我仍在尋找是否有任何方法可以在CakePHP中做到這一點! – 2011-04-15 15:03:30

+0

編輯我的答案,包括一個蛋糕般的做法。 – Tyler 2011-04-15 17:59:39