CakePHP如何获取关联数据和BY / {GROUP BY

问题描述

我在使用CakePHP查询生成器时遇到了一些麻烦,并尝试获得所需的结果。我有三个表“ Users”,“ Items”,“ Owns”,其中Owns既属于“ Users”又属于“ Items”...。一个用户可以拥有许多项目(以及许多相同的项目)。

因此,我希望由用户返回“拥有的”商品以及计数……但是,每当我在查询添加计数时,都会丢失关联的商品数据。

示例-如查询下方所示,它返回用户数据以及关联的所有者数据和关联的项目数据

$owns = $this->Users->get($id,[
  'contain' => [
    'Owns' => function($q) { return $q->find('all')->group(['Owns.item_id']); },'Owns.Items'
  ],]);

由此产生的sql

SELECT 
  Owns.id AS Owns__id,Owns.item_id AS Owns__item_id,Owns.user_id AS Owns__user_id,Items.id AS Items__id,Items.name AS Items__name,Items.description AS Items__description,Items.created AS Items__created,Items.modified AS Items__modified 
FROM 
  owns Owns 
  INNER JOIN items Items ON Items.id = (Owns.item_id) 
WHERE 
  Owns.user_id in (1) 
GROUP BY 
  Owns.item_id

数据结果如下:

'owns' => [
    'id' => (int) 1,'username' => 'myusername','owns' => [
        (int) 0 => object(App\Model\Entity\Own) id:0 {
        'id' => (int) 2
        'item_id' => (int) 1
        'user_id' => (int) 1
            'item' => object(App\Model\Entity\Item) id:1 {
                'id' => (int) 1
                'name' => 'Item Name'
                'description' => 'Item Description'

不过,我想在“所有者”查询添加计数(即拥有的数量)。我可以通过使用此查询获取计数,但是随后我从结果中丢失了关联的项目对象。我已经尝试了许多不同的方法,但是似乎总是想使用sql count来获取相关数据。

$owns2 = $this->Users->get($id,[
  'contain' => [ 
    'Owns' => function($q) { return $q->select(['count' => $q->func()->count('Owns.id'),'Owns.id','Owns.user_id','Owns.item_id'])->group(['Owns.item_id']); },]);

由此产生的sql

SELECT 
  (COUNT(Owns.id)) AS count,Owns.id AS Owns__id,Owns.item_id AS Owns__item_id 
FROM 
  owns Owns 
  INNER JOIN items Items ON Items.id = (Owns.item_id) 
WHERE 
  Owns.user_id in (1) 
GROUP BY 
  Owns.item_id

数据结果如下:

'owns2' => [
    'id' => (int) 1,'owns' => [
        (int) 0 => object(App\Model\Entity\Own) id:36 {
        'count' => (int) 4
        'id' => (int) 2
        'user_id' => (int) 1
        'item_id' => (int) 1

任何对我如何使“计数”进入第一个$ user查询或相关项进入$ user2的见识都会受到赞赏。

解决方法

要保留在$ owns = find('all')查询中返回的关联表字段以及SQL count函数,我需要将相关字段添加到select语句中

$owns2 = $this->Users->get($id,[
  'contain' => [ 
    'Owns' => function($q) { return $q->select(['count' => $q->func()->count('Owns.id'),'Owns.id','Owns.item_id','Owns.user_id','Items.id','Items.collection_id','Items.name','Items.description'])->group(['Owns.item_id']); },'Owns.Items'
  ],

]);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...