问题描述
我在使用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'
],
]);