2012-03-01 65 views
0

的计数的搜索,我需要做一个搜索,通过相关的表中的“计数”的过滤,但我不能这样做..CakePHP的由相关表

下面是该查询:

  $this->paginate = array 
      (
      'Establishment' => array 
      (
       'conditions' => array 
       (
       'EstablishmentsCategory.slug' => $category, 
      ), 
       'limit'  => 10, 
       'order'  => $order, 
       'fields'  => array('Establishment.*'), 
       'contain' => array 
       (
       'EstablishmentsCategory', 
       'EstablishmentsImage', 
       'EstablishmentsCoupon' => array('fields' => array('id')) 
      ) 
      ) 
      ); 

     $data = $this->paginate('Establishment'); 

现在这个返回的数组是这样的:

[0] => Array 
    (
     [Establishment] => Array 
      (
       [id] => 2 
       [establishments_category_id] => 1 
       [slug] => xxxxxx 
       [name] => xxxxxx 
       [description] => xxxxxx 
       [active] => 0 
       [modified] => 2012-01-25 15:31:23 
       [created] => 2011-07-29 10:03:51 
      ) 

     [EstablishmentsCategory] => Array 
      (
       [id] => 1 
      ) 

     [EstablishmentsCoupon] => Array 
      (
       [0] => Array 
        (
         [id] => 2 
         [establishment_id] => 2 
        ) 

      ) 

     [EstablishmentsImage] => Array 
      (
       [0] => Array 
        (
         [id] => 2 
         [establishment_id] => 2 
         [image] => fsdfsdf.jpg 
         [created] => 2012-01-10 11:34:06 
        ) 

       [1] => Array 
        (
         [id] => 3 
         [establishment_id] => 2 
         [image] => werwerwer.jpg 
         [created] => 2012-01-10 11:34:06 
        ) 

       [2] => Array 
        (
         [id] => 4 
         [establishment_id] => 2 
         [image] => werwerwer.jpg 
         [created] => 2012-01-10 11:34:06 
        ) 

       [3] => Array 
        (
         [id] => 7 
         [establishment_id] => 2 
         [image] => werwerer2.jpg 
         [created] => 2012-01-10 13:31:01 
        ) 

      ) 

    ) 

问题:我需要找到,所有的“立”,thah有一个或多个“EstablishmentsCoupon”。我找不到解决方案:S

+0

有什么不对你的归来?使用'contains'语句时,您使用内部联接进行查询,因此只返回具有EstablishmentsCoupon的企业。 – 2012-03-01 12:53:36

+0

其实,数组返回与EstablishmentsCoupon和没有EstablishmentsCoupon创建,我只需要建立有一个或多个EstablishmentsCoupon。 在这种情况下,我有一个EstablishmentsCoupon,但如果创建没有任何EstablishmentsCoupon(空数组),我需要删除它。 – Zenth 2012-03-01 16:56:52

回答

1

您应该可以通过使用group子句和having语句来完成此操作。

但是,被警告,这可能不是如果您的查询要求分割在多个查询的查询,以获得EstablishmentCoupons等

$this->paginate = array(
    'Establishment' => array(
     'conditions' => array(
      'EstablishmentsCategory.slug' => $category, 
     ), 
     'limit' => 10, 
     'order' => $order, 
     'fields' => array('Establishment.*, count(EstablishmentsCoupon.id) as ec_count'), 
     'contain' => array(
      'EstablishmentsCategory', 
      'EstablishmentsImage', 
      'EstablishmentsCoupon' => array(
       'fields' => array('id') 
      ) 
     ), 
     'group' => array('Establishment.* HAVING ec_count > 0'), 
    ) 
); 

$data = $this->paginate('Establishment'); 

在上面的代码我一个递归设置工作已经添加一个ec_countfields参数,然后加到一个使用基于该ec_counthaving一个子句的group参数。

如果看到有关该组的查询语法问题,请尝试使用从建立明确的领域,而不是使用建立。*(这是因为你很可能不使用所有字段和不做事的好方法知道你得到什么)。

同样,这可能不是根据您的查询路径上工作,但这种模式在我工作的系统的一个工作。

0

如果您使用的是属于关联关联(和优惠券属于设立),你可以让你的优惠券模式counterCache。当启用counterCache时,Cake会跟踪每个机构有多少个优惠券。

然后,您可以搜索具有简单的查找条件场所:

$this->Establishment->find('all', 
    conditions => array('Establishment.coupon_count >' => 0) 
    );