2017-02-14 27 views
0

问题:CakePHP的3:包含()函数导致嵌套数据

我想在CakePHP中3

SELECT 
    medicine_records.*, 
    medicines.name AS medicine_name, 
    medicines.subname AS `medicine_subname` 
FROM medicine_records 
INNER JOIN medicines ON medicines.id = medicine_records.medicine_id 

控制器运行此查询:

$medicines = $this->MedicineRecords->find()->contain(['Medicines'])->all(); 

CakePHP的查询日志:

2017-02-14 09:58:47 Debug: duration=1 rows=1 SELECT MedicineRecords.id AS `MedicineRecords__id`, MedicineRecords.user_id AS `MedicineRecords__user_id`, MedicineRecords.medicine_id AS `MedicineRecords__medicine_id`, MedicineRecords.times_pre_day AS `MedicineRecords__times_pre_day`, MedicineRecords.created AS `MedicineRecords__created`, MedicineRecords.modified AS `MedicineRecords__modified`, Medicines.id AS `Medicines__id`, Medicines.name AS `Medicines__name`, Medicines.subname AS `Medicines__subname`, Medicines.type AS `Medicines__type`, Medicines.created AS `Medicines__created`, Medicines.modified AS `Medicines__modified` FROM medicine_records MedicineRecords INNER JOIN medicines Medicines ON Medicines.id = (MedicineRecords.medicine_id) 

结果数据:

"data": [ 
    { 
     "id": 1, 
     "user_id": 1, 
     "medicine_id": 3, 
     "times_pre_day": 2, 
     "created": "2017-02-14T04:55:48+00:00", 
     "modified": "2017-02-14T04:55:48+00:00", 
     "medicine": { 
      "id": 3, 
      "name": "Name", 
      "subname": "Subname", 
      "type": 1, 
      "created": "2017-02-13T09:38:48+00:00", 
      "modified": "2017-02-13T09:38:48+00:00" 
     } 
    } 
] 

此结果在儿童级别有药物。我想在最顶层的所有数据是这样的:

"data": [ 
    { 
    "id": 1, 
    "user_id": 1, 
    "medicine_id": 3, 
    "times_pre_day": 2, 

    "medicine_name": "Name", 
    "medicine_subname": "Subname", 

    "created": "2017-02-14T04:55:48+00:00", 
    "modified": "2017-02-14T04:55:48+00:00", 
    } 
] 

我已经尝试使用public $recursive = -1;但我认为它不工作CakePHP的3

更新

删除WHERE medicine_records.id = 1

回答

0

显然这是预期的结果,包含嵌套形式,它应该是这样。

不用担心,你可以选择字段中包含根据您的需要:

$medicines = $this->MedicineRecords->find() 
     ->contain(['Medicines' => function ($q) { 
      return $q 
       ->select(['medicine_name'=>'name','medicine_subname'=>'subname']); 
     }])->all(); 

看这里(select within contain CakePHP 3)。

+0

对不起,我的错误。在查询中没有'WHERE medicine_records.id = 1'。所以结果可以有很多记录。 (*)*(*)* *对不起* –

+0

你可以发布更新后的结果(如调试() $药物);),如果不是这样做的话。 –

+1

[**选择字段**](https://book.cakephp.org/3.0/en/orm/query-builder.html#selecting-data)可能比直接重新格式化更直接。 – ndm