Вопрос по – что значит рекурсивный в cakephp?

14

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

<code>$this->Author->recursive = 1;
</code>

Спасибо

Ваш Ответ

3   ответа
15

Я бы порекомендовал вам сначала проверить документацию.

Рекурсивный определяет объем данных, которые будут извлечены из базы данных, Cakephp по умолчанию получит данные модели / таблицы, к которым вы запрашиваете, и данные моделей / таблиц, которые связаны с основной моделью / таблицей ( hasmany, принадлежат и т. д.)

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

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

Допустим, в нашем приложении есть авторы, которые продают книги, и их комментируют читатели.

Автор 1 & lt; & gt; * Книга 1 & lt; & gt; * Комментарий

Если мы не установим рекурсивность при получении списка авторов, Cakephp получит список авторов с их книгами и комментариями.

$authors = $this->Author->find('all');

Проблема в том, что для каждого отображения списка Cakephp и база данных имеют дело с большим количеством ненужных данных! что в свою очередь влияет на производительность вашего http & amp; сервер базы данных.

Представьте, что список отображается 10 / с, и в каждом списке 20 авторов (авторы, которые могут иметь от 1 книги до *, скажем, 10 книг в качестве среднего числа для этого примера с 5 комментариями каждый) выполняют математику, и вы увидите, что серверы обрабатывают много ненужных данных, которые в итоге не будут использоваться.

Пользователь хочет видеть только список авторов, поэтому нет необходимости извлекать все книги и комментарии, если только вы не собираетесь обрабатывать их в контроллере или отображать их в представлениях. Мы можем сделать это, установив рекурсивное значение -1.

$this->Author->recursive = -1; 
$authors = $this->Author->find('all');

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

Иногда вы захотите сделать наоборот: допустим, приложение обновляет переменную Auth Session при каждом входе пользователя в систему (обновление ip, информация браузера, токен oauth, информация о группе и т. Д.) И что приложение использует все Информация о родственниках пользователя для адаптации взаимодействия с пользователем, например, если пользователь принадлежит к определенной группе, отображает относительную информацию и параметры для этой конкретной группы, если пользователь разрешил приложению получать доступ к определенной информации об учетной записи стороннего поставщика (Google? ) показывать сервисы, которые используют такие данные - скажем, показать google + фид или что-то подобное и т. д.

Было бы намного проще получить всю относительную информацию о пользователе, как только он вошел в систему, и сохранить ее в сеансе, которая в свою очередь будет использоваться представлениями для адаптации пользовательского опыта. Один из способов сделать это - извлечь относительные данные одну за другой и сохранить их в сеансе или просто установить рекурсивное значение 2 и сохранить результат в сеансе, при этом будут извлечены все относительные данные пользовательской модели.


OLd response

Рекурсивные позволяют вам определять объем данных, получаемых из базы данных. Допустим, у автора много публикаций.

если вы укажете -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 публикаций, и вы хотите запросить базу данных, чтобы найти авторов, если вы не указали рекурсивное свойство, Cakephp получит всех авторов и их публикации !! скажем, 50 авторов * 10 публикаций ..... вы получаете картину, вы запрашиваете массу ненужных данных.

это имеет большое значение, если это сайт с большим трафиком, поскольку, например, в каждом списке авторов отображается запрос на 500 ненужных публикаций (которые не будут использоваться) только для отображения некоторой информации из 50 авторов в списке / таблице.

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

Error: User Rate Limit Exceeded Charmie
3

v1.3, v2.0:

The recursive property defines how deep CakePHP should go to fetch associated model data via find(), findAll() and read() methods.

Imagine your application features Groups which belong to a domain and have many Users which in turn have many Articles. You can set $recursive to different values based on the amount of data you want back from a $this->Group->find() call:

...documentation of the levels omitted...

Set it no higher than you need. Having CakePHP fetch data you aren’t going to use slows your app unnecessarily. Also note that the default recursive level is 1.

спасибо TJ Crowder .. Charmie
16

Cakephp: http://book.cakephp.org/2.0/en/models/model-attributes.html#recursive

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

Error: User Rate Limit Exceeded Charmie
Error: User Rate Limit Exceeded

Похожие вопросы