1

ここでクックブックとさまざまなQ&Aを読んだ後、モデルの関連付けとその機能について概念的に少し混乱しています。そして、誰かが私がこれを正すのを手伝ってくれることを望んでいました。だからここに私の質問があります:

私が理解できる限り、モデルの関連付けは、関連付けられたデータの読み取り/検索に役立ちます。したがって、ユーザーをロードすると、そのユーザーのすべての投稿もロードされますか?しかし、CakePHPが新しいエントリを保存するために多くのことをしていないというのは本当ですか?例:新しい投稿を作成する場合、関連するユーザーのuser_idフィールドを手動で指定する必要がありますが、CakePHPはどういうわけか自動的にそれを行いませんか?手動で言うと、この回答でmentor_idを明示的に定義することを意味します:CakePHPモデルアソシエーションテーブル(データと新しいテーブル付き)

そして、保存するときに両方のモデルに「言及」する必要があるのはなぜですか?例では、$ this-> Mentor-> Student-> save($ student)です。双方向の関連付けを追跡する方法ですか?

4

2 に答える 2

1

ユーザーをロードすると、そのユーザーのすべての投稿もロードされますか?

はい、CakePHPは、モデルのバインドを解除またはバインドするか、使用しているモデルの再帰プロパティを変更しない限り、関連するすべてのデータをロードます

しかし、CakePHPが新しいエントリの保存にあまり役立たないのは本当ですか?たとえば、新しい投稿を作成する場合、関連するユーザーのuser_idフィールドを手動で指定する必要がありますが、CakePHPはどういうわけか自動的にそれを行いませんか?

ユーザーのIDを指定してから保存する必要があります。指定したIDでモデルから保存すると、残りが処理されます。たとえば、投稿モデルとユーザーモデルがあり、ユーザーがAuthを使用してログインしているとします。

  $this->request->data['Post']['user_id'] = $this->Auth->user('id');
  if ($this->Post->save($this->request->data)) {
    $this->Session->setFlash('Your post has been saved.');
    $this->redirect(array('action' => 'index'));
  }

したがって、両方のモデルについて言及する必要はありません。両方について言及する場合は、投稿とユーザーを例として、次のことを行うことができます。

$this->User->read(null, $this->Auth->user('id'));
if ($this->User->Post->save($this->request->data)) {
  $this->Session->setFlash('Your post has been saved.');
  $this->redirect(array('action' => 'index'));
}

これは、ユーザーモデルにユーザーデータをロードし、そのユーザーの投稿を保存しているため、前のケースと同じです。

于 2012-06-20T16:23:36.787 に答える
0

あなたはbelongTo関係を使用していると思いますが、クックブックに記載されているタイプのいずれかである可能性があると思います

ユーザーをロードすると、そのユーザーのすべての投稿もロードされますか?

はい、適切な関係(belongsTo、hasAなど)を設定すると、これはCakeによって自動的に処理されます。

しかし、CakePHPが新しいエントリの保存にあまり役立たないのは本当ですか?たとえば、新しい投稿を作成する場合、関連するユーザーのuser_idフィールドを手動で指定する必要がありますが、CakePHPはどういうわけか自動的にそれを行いませんか?

これはsaveAll、saveAssociatedなどのメソッドで処理されると思いますが、これを使用するシナリオにはまだ直面していません。

そして、保存するときに両方のモデルに「言及」する必要があるのはなぜですか?例では、$ this-> Mentor-> Student-> save($ student)です。双方向の関連付けを追跡する方法ですか?

これは、メインモデルとその依存関係(関係を確立する方法によって異なります)を保存しているためです。そのため、明示的にそのように言う必要があります。これを行う他の方法は、StudenControllerをインポートし(例によると)、(クラスを構築した後)saveメソッドを呼び出すことです。$studentController->Student->save($student)

お役に立てれば

于 2012-06-20T16:05:55.390 に答える