【问题标题】:CakePHP 3: How to populate sum of a column from other tableCakePHP 3:如何从其他表中填充列的总和
【发布时间】:2020-01-29 00:27:52
【问题描述】:

尽管我现在使用的是 cakephp 3.8,但请帮助使用 CAKEPHP 3.X 构建查询。

我有一张像这样的桌子:

还有另一个表,例如:

它们之间没有关联。我不知道在 CAKEPHP 3 中开发以下结果。

SQL QUERY如下:

SELECT *, SUM(t2.amount) AS last7DaysAmount FROM TableA AS t1 LEFT JOIN TableB AS t2 ON t1.customer = t2.customer AND t1.supplier = t2. supplier AND t2.billing_date >= new Date('-7 Days') AND t2.country = t1.country and t2.service = t1.service

如何使用 CakePHP 3 ORM/Query Builder LIKE So 从表 B 中获取最近 7 天选择表 A 语句的金额总和。

感谢您提前帮助我

【问题讨论】:

  • 这 2 个表是如何通过 Client 或 Vendor 链接的?
  • 客户、供应商、服务和国家
  • 所以您想在表 A 中创建一个新列并使用表 B 中的值填充它?
  • 我想在选择查询中得到表 A 的结果 [last7daysAmount]
  • 只能从表B获取所有数据,不需要表A。

标签: mysql sql cakephp cakephp-3.x cakephp-3.7


【解决方案1】:

我给你一个基本的想法:

$a = TableRegistry::getTableLocator()->get('a', ['table' => 'TableA']); // use your table "TableA" as alias "a"
$query = $a->find();
$result = $query->enableAutoFields(true) // select all fields
    ->select(['Last7DaysAmount' => $query->func()->sum('b.amount')]) // select sum('b.amount') AS Last7DaysAmount
    ->where(['b.date >' => DATE(NOW() - INTERVAL 7 DAY)]) // where b.date greater than current minus 7 days
    ->join([ // join other table
        'table' => 'TableB',
        'alias' => 'b',
        'type' => 'left',
        'conditions' => [ // with conditions
            'a.client' => 'b.customer',
            'a.vendor' => 'b.supplier',
            'a.service' => 'b.service',
            'a.country' => 'b.country',
            ]
     ])
    ->group([ // group results by
            'a.client',
            'a.vendor',
            'a.service',
            'a.country',
    ])
    ->order(['a.client' => 'ASC'])
    ->limit(100);

    $this->set('results', $results);

这个查询看起来像:

MariaDB [testdb]> SELECT a.id AS `a__id`, a.client AS `a__client`, a.vendor AS `a__vendor`, a.service AS `a__service`, a.country AS `a__country`, a.destination AS `a__destination`, (SUM(b.amount)) AS `Last7DaysAmount`
-> FROM tableA a 
-> LEFT JOIN tableB b ON (a.client = b.customer AND a.vendor = b.supplier AND a.service = b.service AND a.country = b.country)
-> GROUP BY a.client, a.vendor, a.service, a.country  
-> ORDER BY a.client 
-> ASC LIMIT 100;


+-------+-----------+-----------+------------+------------+----------------+-----------------+
| a__id | a__client | a__vendor | a__service | a__country | a__destination | Last7DaysAmount |
+-------+-----------+-----------+------------+------------+----------------+-----------------+
|     1 | client1   | vendor1   | Gold       | spain      | spain          |             106 |
|     2 | client1   | vendor3   | Gold       | spain      | spain          |              64 |
|     3 | client2   | vendor2   | silver     | germany    | germany        |              16 |
+-------+-----------+-----------+------------+------------+----------------+-----------------+

3 rows in set (0.001 sec)

但是,为什么 CakePHP 将 'Last7DaysAmount' 返回为 null 是另一个问题。

【讨论】:

  • 太棒了!我看到您正在为TableA 使用别名a。有没有办法告诉 ORM?
  • 是的,更新了,也读了book.cakephp.org/3.0/en/orm/table-objects.html#Cake\ORM\TableRegistry::get
  • @Salines,感谢您的出色帮助,我按照您的代码工作,但它返回空结果,我还将 where 子句更改为连接条件,它带来 TableA 数据但总和显示为空
  • debug($result) 并查看查询的外观,也尝试评论这一行 ->where(['b.date >' => DATE(NOW() - INTERVAL 7 DAY)])
  • 总和字段仍为空值
猜你喜欢
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 2020-01-17
  • 2016-06-15
相关资源
最近更新 更多