私は2つのモデルを持っていClient
ますSecurity
. これらは、HATBTM 関係に関連付けられています。という結合テーブルを作成しましたclients_securities
。したがって、aClient
は多くの証券を持つことができ、a は多くの sSecurity
に属することができます。Client
これが私の関係の定義です:
//Client Model:
public $hasAndBelongsToMany = array(
'Security' =>
array(
'className' => 'Security',
'joinTable' => 'clients_securities',
'foreignKey' => 'client_id',
'associationForeignKey' => 'security_id',
'unique' => true,
)
);
//Security Model:
public $hasAndBelongsToMany = array(
'Client' =>
array(
'className' => 'Client',
'joinTable' => 'clients_securities',
'foreignKey' => 'security_id',
'associationForeignKey' => 'client_id',
'unique' => true,
)
);
次に、クライアント コントローラーで編集アクションを作成し、次のようにしました。
public function edit($id = null) {
if (!$id) {
throw new NotFoundException(__('Invalid client'));
}
$client = $this->Client->findById($id);
if (!$client) {
throw new NotFoundException(__('Invalid client'));
}
if ($this->request->is('post') || $this->request->is('put')) {
$this->Client->id = $id;
if ($this->Client->saveAll($this->request->data)) {
$this->Session->setFlash(__('Client has been updated.'));
return $this->redirect(array('action' => 'edit', $id));
}
$this->Session->setFlash(__('Unable to update client.'));
}
if (!$this->request->data) {
$this->request->data = $client;
$this->set('securities', $this->Client->Security->find('list'));
}
}
編集ビューで、HtmlHelper を使用してフォームを作成し、クライアント テーブル フィールドを追加して、次のように複数選択を生成します。
echo $this->Form->create('Client'); //start the form for the client model
echo $this->Form->input('Security'); //generates a multi-select popuplated with securities
さらにClient
、同じフォームの通常の直接フォーム入力もあります。例えば
echo $this->Form->input('name'); //Input for the client name
echo $this->Form->input('currency'); //Input for the client currency
...
これらすべての入力は、フォームがレンダリングされるときに生成され、正しい値が取り込まれますが、複数選択からの HABTM データではなく、直接のクライアント データのみが保存されます。
フォームを送信すると、clients_securities
テーブルに結合 ID が入力されません。
正しく保存し、「編集」ビューをリロードするときに保存された証券を事前に選択するにはどうすればよいですか。
編集:物事を明確にするために、ここにのがpr()
あり$this->request->data
ます。(値 ("ALLCMCT LX Equity") はsecurities
テーブルの正しい外部キーです):
Array
(
[Client] => Array
(
[id] => 1212
[name] => Example Client
[currency] => GBP
[partner] =>
[risk_category_id] => 4
[client_code_id] => 1
[min_cash_balance] => 0
[active] => 1
[model] => 0
[institutional] => 0
[non_uk_situs] => 0
[reporting_status] => 0
)
[Security] => Array
(
[Security] => Array
(
[0] => .1muslib3 index
[1] => .eurib3 index
[2] => .ukcpi2 index
)
)
)
基本的に、私のクライアント ID が 12345 だとすると、Cake は次のclients_securities
ようにテーブルに 2 つのレコードを挿入する必要があります。
id | client_id | security_id
----------------------------
1 | 12345 | ALLCMCT LX Equity
2 | 12345 | APMKNTD LX Equity
いくつかの結合レコードを に手動で追加するclients_securities
と、クライアントを編集するときに、複数選択の証券が正しく事前選択されて表示され、結合テーブルからデータが読み取られていることが示されます。フォームを保存すると、実際には結合レコードが削除されますが、新しいレコードは保存されません。
追加メモ:私のセキュリティ ID は、何らかの影響がある場合はCHAR(36) として保存されます。これは自動インクリメント フィールドではなく、証券のティッカーが含まれており、それぞれが一意です。