Учение объекты огромны - PullRequest
       1

Учение объекты огромны

5 голосов
/ 24 сентября 2011

Я конвертирую .NET в PHP и до сих пор хорошо провожу время с переходом. Я использую Doctrine 1.2 в качестве ORM, и у меня работают мои модели, и все подключено нормально. Однако проблема, на которую я сейчас смотрю, состоит в том, что выходные объекты огромны. У меня есть довольно простая таблица с именем USERS - в ней, вероятно, 8 столбцов и FK для 4 или 5 других таблиц. Я использую приведенный ниже код для увлажнения моего объекта USERS:

$q = Doctrine_Query::create()
->select('u.*')
->from('USERS u')
->where('u.VANITY_URL = ?',$Url_Frag);

$users = $q->execute();

print_r($users);

Я вижу объект гидратированный с моими данными, так что это хорошо. Тем не менее, это также сопровождается тем, что выглядит как набор метаданных, которые мне явно не нужны. В целом, объект имеет длину более 5000 строк! Я уверен, что где-то есть очевидный переключатель, который в основном говорит «только испускать такие-то данные», но я не могу найти его в руководстве по доктрине.

Мысли

Ответы [ 4 ]

7 голосов
/ 25 сентября 2011

В Doctrine2 есть метод dump(), доступный по адресу:

\Doctrine\Common\Util\Debug::dump($var, $maxDepth)

Он выполняет работу, подобную print_r и var_dump, но скрывает все данные, связанные с доктриной.

Может быть, есть что-то похожее для Doctrine 1.x?

6 голосов
/ 09 апреля 2013

Объект и коллекции объектов Doctrine 1.2 имеют метод с именем "toArray".Так что вы можете сделать:

print_r($users->toArray());
1 голос
/ 25 сентября 2011

Если я не ошибаюсь, в сущностях Doctrine1.2 есть ссылки на окружности, поэтому print_r или var_dump для них не очень хорошая идея. На самом деле, если у вас нет чего-то вроде Xdebug, ограничивающего глубину рекурсии, вы никогда не получите вывод в браузер.

Если вы действительно обеспокоены потреблением памяти, используйте функцию memory_get_usage для проверки объема памяти до и после гидратации.

1 голос
/ 24 сентября 2011

У вас есть несколько вариантов.Одним из них является переключение на доктрину2: у нее гладкие модели без какой-либо магии доктрины1.

Вторые - изменить режим гидратации.Вы не можете изменить модель доктрины или упитанность объекта, не изменив логику doctrine_record.Так что это может сработать:

$q = Doctrine_Query::create()
->select('u.*')
->from('USERS u')
->where('u.VANITY_URL = ?',$Url_Frag)
->setHydrationMode(Doctrine::HYDRATE_ARRAY);
$users = $q->execute();

Print_r'ing эти объекты будут огромными, так как в сети классов доктрин много вложенных объектов (в некоторых объектах есть немного «комплекса богов»).

Дополнительную документацию можно найти здесь: http://www.doctrine -project.org / Documentation / manual / 1_2 / pl / data-hydrators: методы гидратации активной зоны

...