2012-09-18 31 views
3

我有像這樣的表的集合:爲什麼Propel不能保存這個查詢,也不會給出任何錯誤?

logbookresponsibilityuser

職責重複使用 - 但每個日誌只有一個不同的責任。每個責任都有一個用戶。用戶可以有多個職責(在多個日誌上)。我有一個表加入這些在一起:

logbook_responsibility,有三個colummns(每個組成的主鍵) - logbook_idresponsibility_iduser_id,這是所有外鍵。在我的schema.xml中,此表設置爲isCrossRef="true"

當更新責任到一個新的用戶,我通過在一個陣列中$_POST$_POST['responsibility'][2] = 5$_POST['responsibility'][7] = 2形式,等我有一個應該更新它們的功能:

public function updateResponsibilities($options = null) 
{ 
    foreach ($options['responsibility'] as $k => $v) {  
    $user = UserQuery::create() 
     ->filterByLogbook($this->logbook) 
     ->findOneById($v); 

    $logbookResponsibility = LogbookResponsibilityQuery::create() 
     ->filterByLogbook($this->logbook) 
     ->filterByResponsibilityId($k) 
     ->findOne(); 

    if (is_null($user) || is_null($logbookResponsibility)) { 
     break; 
    } 

    $logbookResponsibility->setUser($user)->save(); 
    } 

    return true; 
} 

這裏我循環選項,使用提供的ID創建一個新用戶,按當前日誌過濾,以確保他們被允許負責此日誌,並抓住第一個日誌。這工作得很好(甩帶->toArray()

array(11) { 
    ["Id"]=> 
    int(2) 
    ["CompanyId"]=> 
    int(1) 
    ["CurrentLogbookId"]=> 
    int(1) 
    ["OtherFieldsHere..."]=> 
    // etc, etc 

} 

接下來我搶LogbookResponsibility,當前日誌和責任ID再次過濾在這個階段,新的用戶ID顯示正確:

array(3) { 
    ["LogbookId"]=> 
    int(1) 
    ["ResponsibilityId"]=> 
    int(1) 
    ["UserId"]=> 
    int(1) 
} 

然後我用先前抓取的用戶更新這個對象,然後保存,這樣做沒有錯誤,之後檢查對象顯示對象至少已經更新:

array(3) { 
    ["LogbookId"]=> 
    int(1) 
    ["ResponsibilityId"]=> 
    int(1) 
    ["UserId"]=> 
    int(2) 
} 

但是,沒有人去碰任何東西,之後在數據庫中查找,用戶ID仍爲1我已經測試運行查詢,如:

UPDATE logbook_responsibility SET user_id = 1 WHERE logbook_id = 1 AND responsibility_id = 1; 

...這沒有錯誤的原理。

實際問題是雙重的:

1)爲什麼不把它保存? (它是與我的交叉參考表?有沒有用超過2列的交叉參考表有問題?)

2)是否有普遍實現我設置一個更好方式? *(我試着實現與責任對象相同的目標,但沒有看到從那裏更新logbook_responsibility的方法)*

樂於接受建議以及實際答案!

+2

您可以使用'Propel :: getConnection() - > getLastExecutedQuery();'來檢查最後一次查詢運行,這可能會指向正確的方向 – billyonecan

回答

3

正如我以前getLastExecutedQuery()當我運行save()方法來獲得實際的查詢運行保持的意見建議,這是查詢正在運行(這也解釋了爲什麼沒有錯誤):

UPDATE `logbook_responsibility` SET `USER_ID`=3 WHERE 
    logbook_responsibility.LOGBOOK_ID=1 AND 
    logbook_responsibility.RESPONSIBILITY_ID=1 AND 
    logbook_responsibility.USER_ID=3; 

正如你所看到的,更新語句在語法上是正確的,但問題似乎在於Propel如何更新主鍵 - 這讓我想知道爲什麼我的用戶標識列作爲主鍵的一部分?

將用戶作爲主鍵的一部分沒有任何意義,所以我刪除了它,當然這也使它成功了。仍然存在real問題,「我如何更新Propel中的主鍵?」,但是最好用somebody else來解釋。

如果有人有更好的解釋,我很樂意將此標記作爲答案。

相關問題