簡體   English   中英

CakePHP保存HABTM數據

[英]CakePHP saving HABTM data

我有2個型號, ClientSecurity 它們與HATBTM關系相關聯。 我創建了一個名為clients_securities表。 因此, Client可以擁有許多證券,而Security可以屬於許多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。

我需要做什么才能正確保存,然后在重新加載“編輯”視圖時預先選擇保存的證券。


編輯:為了澄清事情,這里是$this->request->datapr() (值(“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條記錄, clients_securities所示:

id | client_id | security_id
----------------------------
1  | 12345     | ALLCMCT LX Equity
2  | 12345     | APMKNTD LX Equity

如果我手動將一些連接記錄添加到clients_securities ,當我去編輯客戶端時,多選中的證券會正確地預先選擇,表明正在從連接表中讀取數據。 當我保存表單時,它實際上刪除了連接記錄但不保存新的。

附加說明:如果有任何影響, 我的安全ID將存儲為CHAR(36) 這不是自動增量字段,它包含安全性的代碼,每個都是唯一的。

問題是security_idSecurity.id的格式:char不受支持。

我找到了這張 (但我在文檔中沒有找到任何參考)

您必須創建另一個具有數字id列以在HABTM關聯中使用

像這樣修改表單輸入:

echo $this->Form->input('Security.Security');
<?php 
Model::saveAssociated(array $data = null, array $options = array());

or

Model::saveAll(array $data = null, array $options = array());
?>

欲了解更多信息,請訪問: http//book.cakephp.org/2.0/en/models/saving-your-data.html

我試試看......

你忘了$ this-> Client-> read(); 在$ this-> Client-> id = $ id之后; 在edit()函數中($ this-> Client的內部未初始化,因此在保存完成時不存在client_id)。 調用“findById”將只返回一個數組,但不會將數據讀取到對象$ this-> Client。

只是一個很好的教育猜測..

也許我已經知道了,但我想您忘了在視圖中創建一個帶有客戶端ID的隱藏輸入

echo $this->Form->hidden('Client.id');

它不是填充媒體表,因為在填充兩個模型后它沒有自己的id來填充mediater表。 因此用戶beforeSave和afterSave函數將填充您的中介表。 在客戶端模型中添加beforesave函數

public function beforeSave($options = array()) {
        parent::beforeSave($options = array());
            foreach (array_keys($this->hasAndBelongsToMany) as $model):
                if(isset($this->data[$this->alias][$model])):
                    $this->data[$model][$model] = $this->data[$this->alias][$model];
                    unset($this->data[$this->alias][$model]);
                endif;
            endforeach;
        return true;
    }

而在Security用戶AfterSave功能中,

public $securityIdArray = array();

public function afterSave($created) {
        if($created) {
            $this->securityIdArray[] = $this->getInsertID();
        }
        return true;
    }

首先保存安全性並使用$ securityIdArray在控制器中$ this-> Model-> save之后獲取安全ID。

$this->Security->securityIdArray[] = $void['Security']['id'];

和啊啊@Arilia說修改你的論壇輸入字段

echo $this->Form->input('Security.Security');

並且不要為兩個模型制作單獨的表格

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM