14

さて、私がフォローしているチュートリアルにこのコード行があります。ただし、再帰に関する明確な説明はありませんでした。私はcakephpの初心者で、この「再帰的」について検索しました。誰かがこのコードの素人の説明を私に提供してくれることを願っています:

$this->Author->recursive = 1;

ありがとうございました

4

3 に答える 3

17

Google での最初の結果は、Cakephp 自体の参照からの明確な説明です: http://book.cakephp.org/2.0/en/models/model-attributes.html#recursive

モデル間に多くのレベルの関連付けがある場合に、クエリからフェッチされるデータの量を制限できるように、モデル データに関連付けられたレコードの取得の深さを設定する必要があります。

于 2012-04-30T09:33:24.447 に答える
16

最初にドキュメントを確認することをお勧めします。

Recursive は、データベースからフェッチされるデータの量を定義します。デフォルトでは、Cakephp は、クエリしているモデル/テーブルのデータと、メインのモデル/テーブルにリンクされているモデル/テーブルのデータを取得します (持っている、属しているなど)

recursive を設定することで、Cakephp に特定の量のデータのみをフェッチするように強制します。モデル/テーブルと recursive で指定された数との間の関連付けの深さに応じて、それは多かれ少なかれ可能性があります。

recursive を -1 に設定すると、クエリしているモデルのデータのみが取得されます。これを高く設定すると、Cakephp はより深い関連付けをフェッチするように求められます。

私たちのアプリには、本を販​​売する著者がいて、読者からコメントをもらっているとしましょう。

著者 1 <> * 書籍 1 <> * コメント

著者のリストを取得する際に recursive を設定しない場合、Cakephp は著者の本とコメントのリストを取得します。

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

問題は、リスト表示ごとに、Cakephp とデータベースが大量の不要なデータを処理していることです。これは、http およびデータベース サーバーのパフォーマンスに影響を与えます。

リストが 10/s 表示され、各リストに 20 人の著者が表示されていると想像してください (1 本から * までの本を所有できる著者、この例では、それぞれ 5 つのコメントを持つ平均数として 10 本としましょう) 計算を行うと、次のことがわかります。サーバーは、最終的には使用されない不要なデータを大量に処理しています。

ユーザーは著者リストのみを表示したいので、コントローラーで処理したり、ビューに表示したりしない限り、すべての本とコメントを取得する必要はありません。これを行うには、recursive を -1 に設定します。

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

使用するフィールドのみをフェッチするようにクエリを最適化すると、全体的なパフォーマンスが向上しますが、それは別の問題です。

場合によっては、逆のことをしたいと思うこともあります: ユーザーがログインするたびにアプリが認証セッション変数を更新し (IP、ブラウザー情報、OAuth トークン、グループ情報などを更新する)、アプリがすべてを使用するとします。ユーザーエクスペリエンスを適応させるためのユーザーの相対的な情報。たとえば、ユーザーが特定のグループに属している場合、その特定のグループに対する相対的な情報とオプションが表示されます。ユーザーがサードパーティプロバイダー (google ?) の特定のアカウント情報へのアクセスをアプリに許可している場合は、表示されますその種のデータを使用するサービス - google+ フィードなどを表示するとしましょう - など。

ユーザーがログインしたら、ユーザーのすべての関連情報を取得して Session に保存する方がはるかに簡単です。これは、ユーザー エクスペリエンスを適応させるためにビューによって使用されます。これを行う 1 つの方法は、相対データを 1 つずつ取得してそれを Session に格納するか、単純に recursive を 2 に設定して結果を Session に格納することです。これにより、ユーザー モデルのすべての相対データが取得されます。


古い応答

recursive を使用すると、データベースから取得するデータの量を定義できます。著者が多くの出版物を持っているとしましょう。

データベースから特定の作成者を取得する前に、再帰に -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 の出版物としましょう。おわかりのように、大量の不要なデータを照会しています。

たとえば、各著者リスト表示で、リスト/テーブルに50人の著者の情報を表示するためだけに、500の不要な出版物情報(使用されない)を照会するため、トラフィックの多いサイトの場合は非常に重要です。

再帰を使用して = -1; 著者を照会する前に、データベースへの負担を軽減し、反応性とパフォーマンスを向上させます。

于 2012-04-30T23:43:21.740 に答える
3

ドキュメントv1.3v2.0から:

find()recursive プロパティは、CakePHP が,findAll()およびread()メソッドを介して関連するモデルデータを取得するためにどのくらい深くするべきかを定義します。

アプリケーションが、ドメインに属し、多くの記事を持つ多くのユーザーを持つグループを備えていると想像してください。呼び出し$recursiveから返されるデータの量に基づいて、さまざまな値に設定できます。$this->Group->find()

...省略されたレベルのドキュメント...

必要以上に高く設定しないでください。使用しないデータを CakePHP でフェッチすると、アプリが不必要に遅くなります。また、デフォルトの再帰レベルが 1 であることにも注意してください。

于 2012-04-30T09:32:44.090 に答える