2011-04-15 68 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

相关问题