2017-02-14 13 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.

Update

Удалить 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'. Таким образом, результат может иметь много записей. Я использую: '$ medicines = $ this-> MedicineRecords-> find() -> содержать (['Medicines']) -> all();' * Извините * –

+0

Вы можете публиковать с обновленным результатом (например, debug ($ лекарства);), если это не сделано. –

+1

[** Выбор полей **] (https://book.cakephp.org/3.0/en/orm/query-builder.html#selecting-data) так, как это необходимо, возможно, более прямолинейно, чем переформатирование всего , – ndm