【问题标题】:Get all rows where the field is not NULL in CakePHP 3获取 CakePHP 3 中字段不为 NULL 的所有行
【发布时间】:2018-01-29 16:34:50
【问题描述】:

如何获取字段不为 NULL 的 Table 的所有实例?

这里是配置:

我有一个表 1,其中的实例与表 2 有“hasmany”关系。我想将表 1 的所有实例与表 2 实例链接,而不是 NULL。

CakePHP 文档帮助我找到了 exists()isNotNull() 条件,但我没有实现。

这是我的想象:

$Table1 = TableRegistry::get('Table1')->find('all')->contain([
            'Table2' => [
                'sort' => ['Table2.created' => 'desc']             
            ]
        ])->where([
            'Table1.id' => $id,
            'Table2 IS NOT NULL'
        ]);
        $this->set(compact('Table1'));

但这显然行不通。

edit:我希望将 Table1 中包含现有 Not NULL Table2 行的所有行都链接起来。问题出在带有“Table2 IS NOT NULL”的“where”数组中,它不起作用。 如果没有这行“Table2 IS NOT NULL”,我会得到所有包含 Table2 行的 Table1 行(因为 Table1 的某些行根本没有链接,我不想得到这些行)。

【问题讨论】:

  • 请说明您期望的结果,并将其与您实际获得的结果进行比较。
  • 您好,我希望将 Table1 中包含现有 Not NULL Table2 行的所有行都链接起来。问题出在带有“Table2 IS NOT NULL”的“where”数组中,它不起作用。如果没有这行'Table2 IS NOT NULL',我会得到所有包含 Table2 行的 Table1 行(因为 Table1 的某些行根本没有链接,我不想得到这些行)谢谢你的回答这么快。

标签: php cakephp get frameworks instance


【解决方案1】:

假设表格遵循约定并使用“id”作为主键,我建议最简单的解决方法是测试该字段是否为 NOT NULL。

即,替换这个:

'Table2 IS NOT NULL'

用这个:

'Table2.id IS NOT NULL'

或:

'Table2.id !=' => null

或:

'Table2.id >' => 0

【讨论】:

    【解决方案2】:

    我已成功获取 Table1 行及其现有的 Table2 行相关联。

    query = TableRegistry::get('Table1')->find();
                    $query->select(['Table1.id', 'count' => $query->func()->count('Table2.id')])->matching('Table2')->group(['Table1.id'])->having(['count
            >' => 0]);
    
                    $table1Ids = [];
                    foreach ($query as $z)
                    {
                        $table1Ids[] = $z->id;
                    }
    
                    $table1= TableRegistry::get('Table1')->find('all')->contain([
                        'Table2' => [
                            'sort' => ['Table2.created' => 'desc']             
                        ]
                    ])->where([
                        'id IN' => $table1Ids,
                    ]);
    

    【讨论】:

    • 几乎所有这些都是不必要的,您所需要的只是使用matching('Table2')(可能还有分组)的单个查询,它会生成一个INNER 连接,因此拒绝所有Table1 记录至少存在 1 条匹配的 Table2 记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多