【问题标题】:Cakephp 3: how to restrict a query by its contained modelCakephp 3:如何通过其包含的模型限制查询
【发布时间】:2021-06-26 21:25:48
【问题描述】:

我有三个关联模型,Clients 有许多 Preinvoices 并且属于一个 Group。我想将我对客户的查询限制为仅具有关联 Preinvoices 的客户(应用条件后,请参见下文)。

这是我正在做的事情的概要(我认为您可以忽略 Groups 部分)。

$clients = $this->Clients->find()
    ->order(['Groups.name' => 'ASC'])
    ->contain('Groups');
  $clientPreinvoiceConditions = [
    'Preinvoices.last_processed <' => $cutOffDateTime,
  ];
  $clients->contain('Preinvoices', function (\Cake\ORM\Query $q) use ($clientPreinvoiceConditions) {
    return $q
      ->where($clientPreinvoiceConditions);
    });

到目前为止一切顺利——我正在获得一份完整的客户名单,其中包含符合条件的预发票。但是,最好只获取实际上有任何预发票的客户。

我想做这样的事情:

$clients->having(['COUNT(Preinvoices.id) >' => 0]);

但这似乎不太对劲。我得到了错误:

Unknown column 'Preinvoices.id' in 'having clause'

顺便说一句,尽管我确实在结果中得到了 Preinvoices.id。

我还尝试先选择计数作为自己的列,以便我可以在having() 中引用它,但没有成功:

$clients->select([
        'preinvoiceCount' => 'COUNT(Preinvoices.id)'
      ]);

这给了我错误:

Unknown column 'Preinvoices.id' in 'field list'

Cake 中的复杂查询似乎总是难倒我。想法?

【问题讨论】:

标签: cakephp-3.0


【解决方案1】:

正如 ndm 的评论所指出的,这个问题与这里解决的问题非常相似: How to filter by conditions for associated models?

在我的特殊情况下,这意味着将我的“包含”更改为“匹配”,并添加一个正常的“包含”,如下所示:

  $clients->matching('Preinvoices', function (\Cake\ORM\Query $q) use ($clientPreinvoiceConditions) {
    return $q
      ->where($clientPreinvoiceConditions);
    });
  $clients->contain('Preinvoices');

【讨论】:

    猜你喜欢
    • 2021-04-16
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 2019-06-22
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    相关资源
    最近更新 更多