2017-02-14 75 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