【问题标题】:CakePHP Query - Conditional Based on Contain FieldCakePHP 查询 - 基于包含字段的条件
【发布时间】:2017-05-27 19:44:00
【问题描述】:

我正在开发一个系统,该系统保存来自客户计算机的报告并在列表中显示故障。我正在尝试编写一个查询来定位所有当前发生故障或过去发生故障的系统。

我的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 Query Builder。提前致谢!

【问题讨论】:

  • 我可能会使用计数器缓存来计算这些...这很容易成为最简单的答案,然后您可以将报告的数量存储在 Computers 表中,这在其他方面会很方便也可能。

标签: cakephp associations filtering cakephp-3.0 query-builder


【解决方案1】:

您需要使用matching 它类似于包含,但它会根据相关数据进行过滤:

会是这样的

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

请务必注意,如果您需要显示此表上的某些数据,您还必须contain Reports 表。

Reference

【讨论】:

  • 我尝试使用匹配,它为每个匹配的报告复制了计算机。有没有办法让 last_report_pass 0 的报告像常规包含一样包含在子数组中?
  • 编辑了原帖,添加了 distinct 子句,猜测可能有用
猜你喜欢
  • 1970-01-01
  • 2020-08-15
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多