Только до уровня уровня: 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?
Странно, потому что обычно вложенные объекты также гидратируются. – arilia
- это ваш фактический код или просто пример? – arilia
Просто пример. Я не хотел публиковать свой «настоящий» код, так как он потребует наличия фона в моей информации о схеме и db, поэтому я использовал схему из учебников. Но я думаю, что я только что заметил что-то, что я добавлю к вопросу .. hasMany отношения, кажется, возвращают массив сущностей, а ownTo возвращает одну запись в массиве. –