我已經能夠使用CakePHP的saveAll方法同時創建'Members'並將它們註冊到'Event'(創建HABTM鏈接記錄)中,這非常棒。例如,下面的代碼創建了兩個新的「成員」,並增加了他們每個人的記錄到「EventsMember」表,登記他們「事件」 10:使用saveAll的CakePHP:如何使用HABTM鏈接記錄保存額外的數據?
$data = array(
'0' => array(
'Member' => array('email' => '[email protected]'),
'Event' => array('id' => 10)
),
'1' => array(
'Member' => array('email' => '[email protected]'),
'Event' => array('id' => 10)
)
);
$this->Member->saveAll($data);
然而,在「EventsMember」表中的記錄還有一個名爲「角色」的字段,其中包含「演示者」或「主持人」或「參加者」之類的內容,並且我希望在創建關係時保存該數據。我想這和它不工作(以下簡稱「EventsMember「角色」領域始終是空白):
$data = array(
'0' => array(
'Member' => array('email' => '[email protected]'),
'Event' => array('id' => 10),
'EventsMember' => array('role' => 'Host')
),
'1' => array(
'Member' => array('email' => '[email protected]'),
'Event' => array('id' => 10),
'EventsMember' => array('role' => 'Attendee')
)
);
$this->Member->saveAll($data);
我想知道如果這甚至有可能,如果可能我不得不使用某種回調像beforeSave或afterSave完成此操作?我讀過使用saveAll時這些回調存在一些問題,所以我正在尋找關於這裏最佳實踐的任何提示。
謝謝!
編輯:我把亞當的意見,並提出以下修改我的模型:
// Event.php
var $hasMany = array('EventsMember');
// Member.php
var $hasMany = array('EventsMember');
// EventsMember.php
var $belongsTo = array('Event', 'Member');
在我的控制器
然後,我的代碼看上去幾乎等同於我的第二個例子,除了我從EventsMember
稱爲saveAll()
方法模型,如文檔中描述:
$data = array(
'0' => array(
'Member' => array('email' => '[email protected]'),
'Event' => array('id' => 10),
'EventsMember' => array('role' => 'Host')
),
'1' => array(
'Member' => array('email' => '[email protected]'),
'Event' => array('id' => 10),
'EventsMember' => array('role' => 'Attendee')
)
);
$this->EventsMember->saveAll($data);
結果是沒有Member
或EventsMember
記錄被保存在所有。我嘗試從Member
模型($this->Member->saveAll($data);
)觸發保存並保存了Member
記錄,但沒有加入EventsMember
記錄。
我嘗試刪除已有的HABTM關聯,並沒有區別。當我打電話給$this->EventsMember->saveAll($data);
時,EventsMember
模型的beforeSave
方法正在觸發,但看起來它實際上不會保存任何內容。
我很困難。
更新:事實證明,沒有創建記錄,因爲連接記錄全部使用Event ID和Member ID創建,這與我在這兩個字段中組合的唯一鍵(即,沒有成員可以參加兩次活動)。
這是否表明連接模型saveAll功能不像記錄那樣工作,因爲成員記錄沒有被創建(意味着在連接記錄中沒有成員標識),並且現有的事件標識不是被傳遞到加入EventsMember記錄嗎?
VERDICT:我將控制器更改爲在每條記錄上循環,並嘗試爲陣列的每個索引$this->EventsMember->saveAll($data)
,而不是一次傳遞整個陣列。它的工作,但比我的第一個例子(在最上面)顯着慢。請注意,我正在使用交易,因此可能使用atomic => false;
選項會加快速度,同時仍允許我從任何無效記錄中恢復。底線,如果你需要在連接表記錄中保存額外的數據,你必須一次處理它們一個。如果不是,請使用頂部的方法以獲得最佳性能。
這看起來像我想要的,但它似乎並沒有工作。我添加了hasMany和belongsTo關係,並從連接表($ this-> EventsMember-> saveAll())中觸發saveAll,但在任何表中都沒有創建記錄。我嘗試了這兩種方法,無論是否刪除舊的HABTM關係。如果我從父表中觸發saveAll($ this-> Member-> saveAll()),則會保存成員記錄,但不保存EventsMember記錄。我會用結果更新我的問題。 – iopener 2011-02-27 00:10:02
謝謝,這讓我看着正確的道路。不幸的是,除非我遺漏了一些東西,CakePHP無法保存所有批量連接表記錄。 – iopener 2011-02-27 21:36:43