私の問題を明確にするために、CakePHP ドキュメントの Profile <-> User の例を使用したいと思います。そこで定義されている関係は次のとおりです。
- プロフィールの所属ユーザー
- ユーザー hasOne プロファイル
データベースのプロファイル テーブルには、関係を格納するために使用される user_id というフィールドがあります。
ほとんどの例では、ユーザーはプロファイル領域でこの関係を設定または編集します。意味: プロファイルの編集ビューには、プロファイルに別のユーザーを設定できる入力フィールドがあります。Profiles/edit ビューに以下を配置することで、自動的に機能しました。
echo $this->Form->input('user_id');
権利管理の変更により、この関係を設定する方法を変更する必要があります。プロファイル領域から取り出して、代わりにユーザー領域に表示する必要があります。
UsersController で User レコードのデータを読み取るとき ($this->request->data = $this->User->read(null, $id);)、CakePHP は自動的に Profile データを User データにバインドします (存在する)。ただし、users テーブルにはフィールド profile_id がないため (関係が「反対側」に格納されているため)、明らかに echo $this->Form->input('profile_id')); を使用します。ユーザー/編集ビューでは機能しません。
コントローラーの編集アクションで最初にプロファイルのリストを作成する必要があることは既に学びました。
$this->set('profiles', $this->User->Profile->find('list'));
次に、CakePHP に選択リストを作成させます。
echo $this->Form->input('Profile');
ただし、何かが足りないようです。私たちの場合、CakePHP が作成する HTML 出力を見ると、選択リストのいくつかのオプション要素に selected 属性が設定されていますが、ユーザーの特定のプロファイルは 1 つしかなく、そのプロファイルは $this->data に保存されています。
どういうわけか、それを機能させるには、さらにオプションを設定する必要があると思います(自動的に機能させる方法がある場合-おそらくないかもしれません)。
Form->input() 呼び出しの 'selected' 属性を設定できるということです。CakePHP が作成するフォーム要素の名前は "data[Profile]" であるため、CakePHP が自動的に変更を正しく保存するのか、それとも手動で行う必要があるのかはわかりません。手順は次のとおりです。
- user_id が現在のユーザー レコードの ID に設定されている (以前と現在の) 現在のプロファイル レコードを探し、その user_id を 0 (または NULL) に設定します。
- ID が data[Profile] に設定されているプロファイルを探し、その user_id を現在のユーザーの ID に設定します。
しかし、私は自分でそれをしなければならないのでしょうか、それとも CakePHP がそれをできるようにするために何かを逃したのでしょうか?