2017-05-27 36 views
0

我正在开发一个系统,它保存来自客户计算机的报告并在列表中显示失败。我正试图编写一个查询来查找当前所有失败或失败的系统。CakePHP查询 - 有条件的基于包含字段

我的模型Computers有一个字段,说last_report_pass,它允许我快速查找当天发生故障的计算机。我的Reports与一个计算机ID相关联,并且有一个名为status的字段,表示它是合格还是失败。

我试图编写一个只显示last_report_pass0或查询失败的查询,或者如果查找到并加入报告(意思是之前有失败),则显示查询。

这里是我的想法:

$computers = $this->Computers->find('all', [ 
    'conditions' => [ 
     'last_report_pass' => '0', 
     'COUNT(Reports) NOT' => '0' 
    ], 
    'contain' => [ 
     'Reports' => [ 
      'conditions' => [ 
       'status' => '0' 
      ] 
     ] 
); 

我不知道该怎么在这里做。我大概可以在SQL中编写它,但我试图坚持使用Cake的ORM查询生成器。提前致谢!

+0

我可能会使用一个计数器缓存来算这些......它会是容易的简单的答案,然后你将存储这将是其他方式方便的在计算机表中报告的数量也许。 –

回答

0

您将需要使用matching 其相似遏制,但它会通过相关的数据进行过滤:

它会是这样的

$query->distinct(['Computers.id']) 
    ->matching('Reports', function ($q) { 
     return $q->where(['Reports.last_report_pass' => 0]); 
    }); 

其重要的发现,你也将有containReports表,如果你需要显示该表上的一些数据。

Reference

+0

我尝试使用匹配,它为每个匹配的报告重复计算机。有没有办法做到这一点,所以带有last_report_pass 0的报告包含在子数组中,因为它与常规的包含? –

+0

编辑原文,添加了不同的条款,猜测可能会有效 – diego182