2016-02-11 1 views
0

Только до уровня уровня: CakePHP 3 представляет объекты Entity, которые могут представлять запись ORM (база данных) как объект, а не массив. Создание объекта из необработанных данных называется «гидратация». У этого есть плюсы и минусы, в зависимости от того, чего вы пытаетесь достичь, поэтому CakePHP дает вам возможность контролировать гидратацию через функцию hydrate(), которая может быть привязана в запросе.Cakephp 3: Увлажнение вложенных объектов в результатах запроса

То, что я наблюдал, только результаты верхнего уровня гидратируются; вложенных результатов нет. Так что, если мой запрос что-то вроде:

$authors=$this->Authors->find("all")->contain("Books"); 
$this->set("authors",$authors); 

будет возвращать что-то вдоль линий

authors (array) << This is an array since we can have multiple records 
    0 (object) <<< This is the Entity object representing the first Author 
    id 1 
    name "Roger Kaplan" 
    [other author fields] 
    books (array) <<< This is an array because there are multiple books 
     0 (array) <<< I expect this to be an entity object!! 
     id 100 
     title "CakePHP Made Easy" 
     [other book fields] 
     1 (array) <<< I want this to be an entity too 
     id 101 
     title "Solving Java-induced Neuroses" 
     [other book fields] 

Можно ли иметь вложенные объекты гидратированных, а?

Причина, по которой я прошу, заключается в том, что я создаю помощников, которые ожидают передачи объекта сущности, и использует метаданные объекта сущности для создания интересных вещей. Я хочу иметь возможность передавать вложенные записи, а также файлы верхнего уровня.

EDIT: Что-то, что я заметил только в том, что принадлежит ассоциациям, в которых будет только одна запись, будет вставлена ​​в виде массива значений (т. Е. Не является сущностью), в то время как hasMany-ассоциации возвратят массив сущностей. Вот свалка из моего фактического проекта; Я попытался изменить его для ясности:

$message = $this->Messages->find("all")->where(["Messages.id" => $message_id])->contain(["MessageBodies","JobOrders","Candidates"])->first(); 

сообщения belongsTo Кандидаты и JobOrders и hasMany MessageBodies.

Вот рендеринг результата:

message(array) 
    id 1 
    job_order_id 2 
    candidate_id 1 
    candidate(array) 
     id 1 
     first_name Roger 
     last_name Kaplan 
    job_order(array) 
     id 2 
     name Chief Cook and Bottle Washer 
    message_bodies(array) 
     0(object) 
     1(object) 
     2(object) 

Так что, если мое предположение верно, что только hasMany ассоциации возвращаются как массив сущностей, вопрос в том, как я могу получить belongsTo (и, возможно, hasOne, который я обычно не использую) содержал данные, чтобы отображать их как Entity?

+0

Странно, потому что обычно вложенные объекты также гидратируются. – arilia

+0

- это ваш фактический код или просто пример? – arilia

+0

Просто пример. Я не хотел публиковать свой «настоящий» код, так как он потребует наличия фона в моей информации о схеме и db, поэтому я использовал схему из учебников. Но я думаю, что я только что заметил что-то, что я добавлю к вопросу .. hasMany отношения, кажется, возвращают массив сущностей, а ownTo возвращает одну запись в массиве. –

ответ

0

Данные, переданные в представление, действительно содержат вложенные объекты, проверенные отладчиком. Я использовал средство просмотра переменных на панели инструментов Cake, чтобы посмотреть на структуру, и это представление сообщает встроенные объекты как массивы. Основываясь на этих данных, я дошел до структуры с помощью «синтаксиса массива», но объект Cake достаточно умен, чтобы перехватить это и преобразовать в вызовы get().

Смежные вопросы