Хорошо, у меня есть эта строка кода в следующем учебнике. Однако это не дало мне ясного объяснения относительно рекурсивного. Я новичок в cakephp и искал об этом "рекурсивном". Я надеюсь, что кто-то может предоставить мне объяснение этого непрофессионала:
Ответ 2
Я бы рекомендовал сначала проверить документацию.
Рекурсивный определяет объем данных, которые будут извлечены из базы данных, Cakephp по умолчанию получит данные модели/таблицы, которые вы запрашиваете, и данные моделей/таблиц, которые связаны с основной моделью /table (hasmany, принадлежит и т.д.)
Установив рекурсивный режим, вы вынуждаете CakePHP получать только определенный объем данных, он может быть более или менее, в зависимости от того, насколько глубока связь между моделями/таблицами и числом, указанным в рекурсивном.
Настройка рекурсивного на -1 приведет к получению только данных модели, для которой вы запрашиваете, установив ее выше, и попросит Cakephp получить более глубокую ассоциацию.
Давайте скажем, что в нашем приложении у нас есть авторы, которые продают книги, и их комментируют читатели.
Автор 1 < > * Книга 1 < > * Комментарий
Если мы не будем рекурсивным при выборе списка авторов, Cakephp получит список авторов своих книг и комментариев.
$authors = $this->Author->find('all');
Проблема в том, что для каждого отображения списка Cakephp и база данных имеют дело с большим количеством ненужных данных! которые в свою очередь влияют на производительность вашего сервера HTTP и базы данных.
Представьте, что список показан 10/s, и каждый список показывает 20 авторов (авторов, которые могут иметь от 1 книги до *, скажем, 10 книг как среднее число для этого примера с 5 комментариями каждый) делают математику, а вы увидит, что серверы обрабатывают много ненужных данных, которые не будут использоваться в конце.
Пользователь хочет просмотреть список авторов, поэтому нет необходимости извлекать все книги и комментарии, если вы не собираетесь обрабатывать их в контроллере или отображать их в представлениях. Мы можем сделать это, установив рекурсивный на -1.
$this->Author->recursive = -1;
$authors = $this->Author->find('all');
Возможно, вы захотите оптимизировать свои запросы, чтобы он извлекал только те поля, которые вы собираетесь использовать, это повысит общую производительность, но это другой объект.
Иногда вы обнаружите, что хотите сделать обратное: скажем, что приложение обновляет переменную сеанса Auth всякий раз, когда пользователь регистрируется (обновляет ip, информацию обозревателя, токен oauth, информацию о группе и т.д.) и что приложение использует всю информацию о родственниках пользователей, чтобы адаптировать пользовательский опыт, например, если пользователь принадлежит к определенной группе, показывает относительную информацию и параметры этой конкретной группы, если пользователь разрешил приложению получать доступ к определенной информации об учетной записи стороннего поставщика (google?) показать службы, которые используют такие данные - скажем, показать google + feed или что-то - и т.д.
Было бы намного проще получить всю относительную информацию пользователя после его входа в систему и сохранить его в сеансе, который в свою очередь будет использоваться представлениями для адаптации пользователя. Одним из способов сделать это будет выборка относительных данных по одному и сохранение ее в сеансе или просто установка рекурсивного на 2 и сохранение результата в сеансе, он будет извлекать все относительные данные пользовательской модели.
OLd-ответ
Рекурсивный позволяет вам определить объем данных, которые нужно получить из базы данных. Допустим, у автора много публикаций.
если вы указали -1 для рекурсивного, прежде чем получить определенный автор из базы данных, например:
$this->Author->recursive = -1;
$author = $this->Author->findByName('Someone');
вы получите только информацию об авторе/вы получите информацию только из таблицы "Авторы" и ни одна из связанных таблиц, таких как публикации.
вы можете это увидеть сами, используя этот код:
//only author info
$this->Author->recursive = -1;
$author = $this->Author->findByName('Someone');
//display the result
debug($author);
//get the author and related publications info
$this->Author->recursise = 1;
$authorAndPublications = $this->Author->findByName('Someone');
//display result
debug($authorAndPublications);
exit;
Рекурсивное свойство затем укажите, сколько информации вы хотите получить в своей базе данных.
Где я должен его использовать?
позволяет предположить, что у каждого автора есть как минимум 10 публикаций, и вы хотите запросить базу данных, чтобы найти авторов, если вы не указали рекурсивное свойство, CakeFp также получит все авторы и их публикации!! так скажем 50 авторов * 10 публикаций..... вы получаете картину, вы запрашиваете тонну ненужных данных.
это много, если это сайт с высоким трафиком, поскольку, например, в каждом списке авторов отображается запрос на 500 ненужных публикаций (которые не будут использоваться), чтобы отобразить некоторую информацию из 50 авторов в списке/таблице.
с помощью рекурсивного = -1; перед запросом для авторов вы облегчите нагрузку на базу данных, что приведет к лучшей реактивности и производительности.