2011-02-26 110 views
1

我已經能夠使用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); 

結果是沒有MemberEventsMember記錄被保存在所有。我嘗試從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;選項會加快速度,同時仍允許我從任何無效記錄中恢復。底線,如果你需要在連接表記錄中保存額外的數據,你必須一次處理它們一個。如果不是,請使用頂部的方法以獲得最佳性能。

回答

1

在這種情況下,您可以使用The Join Model

+0

這看起來像我想要的,但它似乎並沒有工作。我添加了hasMany和belongsTo關係,並從連接表($ this-> EventsMember-> saveAll())中觸發saveAll,但在任何表中都沒有創建記錄。我嘗試了這兩種方法,無論是否刪除舊的HABTM關係。如果我從父表中觸發saveAll($ this-> Member-> saveAll()),則會保存成員記錄,但不保存EventsMember記錄。我會用結果更新我的問題。 – iopener 2011-02-27 00:10:02

+0

謝謝,這讓我看着正確的道路。不幸的是,除非我遺漏了一些東西,CakePHP無法保存所有批量連接表記錄。 – iopener 2011-02-27 21:36:43