Подтвердить что ты не робот

В чем смысл рекурсивного в тэке?

Хорошо, у меня есть эта строка кода в следующем учебнике. Однако это не дало мне ясного объяснения относительно рекурсивного. Я новичок в cakephp и искал об этом "рекурсивном". Я надеюсь, что кто-то может предоставить мне объяснение этого непрофессионала:

$this->Author->recursive = 1;

Спасибо

4b9b3361

Ответ 1

Первый результат в Google - это ясное объяснение по ссылке Cakephp: http://book.cakephp.org/2.0/en/models/model-attributes.html#recursive

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

Ответ 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; перед запросом для авторов вы облегчите нагрузку на базу данных, что приведет к лучшей реактивности и производительности.

Ответ 3

Из документации v1.3, v2.0:

Рекурсивное свойство определяет, насколько глубокий CakePHP должен пойти, чтобы получить связанные данные модели с помощью методов find(), findAll() и read().

Представьте, что ваши функции приложений Группы, которые принадлежат домену, имеют много пользователей, которые, в свою очередь, имеют много статей. Вы можете установить $recursive на разные значения в зависимости от объема данных, которые вы хотите вернуть из вызова $this->Group->find():

... документация уровней, опущенных...

Установите его не выше, чем вам нужно. Если CakePHP извлекает данные, которые вы собираетесь использовать, это замедляет ваше приложение без необходимости. Также обратите внимание, что рекурсивный уровень по умолчанию равен 1.