【问题标题】:CakePHP 3.x - SUM() on ManyToManyCakePHP 3.x - 多对多上的 SUM()
【发布时间】:2016-08-13 17:47:07
【问题描述】:

我一直在使用 CakePHP 3 中结合关联进行的 SQL 函数查询。

情况如下:我有三个表,一个'products'表,一个'orders'表和一个名为'orders_products'的连接表。

在 OrdersController 的索引中,我想将总价格(= 相关产品价格的总和)添加到订单表中。在 SQL 中,这完全可以通过以下查询来完成:

SELECT orders.id, SUM(products.price)
FROM orders
LEFT JOIN orders_products
ON orders.id = orders_products.order_id
LEFT JOIN products
ON orders_products.product_id = products.id
GROUP BY orders.id;

我认为遵循控制器代码应该可以解决问题:

$orders = $this->Orders->find('all')->contain(['Products']);

$orders
        ->select(['total_price' => $orders->func()->sum('Products.price')])
        ->group('Orders.id');

但是,当查询对象被执行时,我得到一个错误:

错误:SQLSTATE[42S22]:找不到列:1054 未知列 '字段列表'中的'Products.price'

...即使定义了订单和产品之间的关联。

只调用$orders = $this->Orders->find('all')->contain(['Products'])->all(); 确实会返回一个订单数组,每个订单有许多产品,必须正确设置模型。有什么想法可能是错的吗?提前致谢!

来自OrdersTable

$this->belongsToMany('Products', [
    'foreignKey' => 'order_id',
    'targetForeignKey' => 'product_id',
    'joinTable' => 'orders_products'
]);

来自ProductsTable

    $this->belongsToMany('Orders', [
        'foreignKey' => 'product_id',
        'targetForeignKey' => 'order_id',
        'joinTable' => 'orders_products'
    ]);

【问题讨论】:

    标签: mysql cakephp-3.0 has-and-belongs-to-many


    【解决方案1】:

    一种方法:

    $orders = $this->Orders->find()
        ->select([
            'order_id' =>'orders.id',
            'price_sum' => 'SUM(products.price)'
         ])
        ->leftJoin('orders_products', 'orders.id = orders_products.order_id'),
        ->leftJoin('products', 'orders_products.product_id = products.id')
        ->group('orders.id');
    

    【讨论】:

    • 谢谢,这行得通。但是,手动使用连接表不是很奇怪吗?这不是->contain 函数和模型的用途吗?我的意思是,已指定连接表和相关字段。
    • 根据表之间的关系,contain 可能会导致连接,也可能会导致在第一个查询完成后发出第二个查询。在后一种情况下,如果您的查询依赖于同一查询中引用的所有表,则必须强制连接。
    • 感谢您的澄清。不过,哪种方法是必要的似乎仍然有点武断。
    • 从 CakePHP 3.1 开始,您可以使用 use leftJoinWith(),它可以只使用关联别名,并且支持类似于 contain() 的查询回调。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多