2012-03-21 64 views
1

我正在使用Datamapper ORM 1.8.2.1和CodeIgniter 2.1.0,並且無法從父項中訪問新添加的相關對象。如何訪問Datamapper中新保存的相關對象ORM

我有這樣的父類:

class Virement extends DataMapper 
{ 
    var $has_many = array("lignevirement"); 
    // ... 
} 

和子類是這樣的:

class LigneVirement extends DataMapper 
{ 
    var $has_one = array("virement"); 
    // ... 
} 

在用戶代碼中,我實例化這個家長,並添加一些子對象:

$vrt = new Virement;  // and do some inits on properties. 
$vrt->save(); 

$lili = new LigneVirement; // do some inits also on properties. 
$lili->save(); 
$vrt->save($lili); 

$lili = new LigneVirement; // do some inits also on properties. 
$lili->save(); 
$vrt->save($lili); 

// ... 

當我在添加子對象後立即計數,我得到0:

echo $vrt->lignevirement->count(); 

...而採取的數據庫表一看顯示,父記錄已添加,所有子記錄已被添加,他們是正確相關與父記錄。

順便說一句,當我再嘗試這種解決方法,我得到了正確數量的子行:

$vrt = new Virement($vrt->id); 

那麼,什麼可能是錯誤上面我的代碼?

+0

碰巧爲了業務規則強制原因,我重寫了save()方法。不知道這是否與問題有關,解決方法如下所示:public function save($ prmObject =「」,$ prmRelatedField =「」){... $ this-> get(); }。 get()似乎強制重新加載對象樹並使子對象可用。 – IhariR 2012-03-21 20:30:33

+0

這個解決方法的另一個演變:如果我立即一個接一個地實例化兩個新對象並在其上調用save(),Datamapper ORM似乎會感到困惑,併爲兩者恢復同一個id。但是,當您查看數據庫時,您會看到兩個不同的ID,即保存已正確完成,但兩個新對象未正確填充。爲了解決這個問題,先前的get()代碼變爲:** $ this-> where(「id」,$ this-> id) - > get(); ** – IhariR 2012-03-31 20:40:14

+0

我的猜測是某事被緩存在某處 - 你的數據庫緩存查詢結果? – swatkins 2012-06-26 14:18:01

回答

0

根據我的經驗,Datamapper不會在保存後立即訪問相關對象。這包括顯示相關對象的屬性;從你的榜樣跟着上,下面的代碼將顯示$ VRT對象的ID:

$vrt = new Virement; 
$vrt->get_by_id(1); 
$li = new LigneVirement; 
$li->save($vrt); 
echo $li->vrt->id; 

但是,如果您重定向或重新載入頁面,然後重新加載$李對象,所有相關項目將按預期提供。

如果您確實需要立即提供相關項目,您可以創建一個新的相關對象,並根據_id值加載它,如您所建議的。喜歡的東西:

$vrt = new Virement; 
$vrt->get_by_id(1); 
$li = new LigneVirement; 
$li->save($vrt); 
$vrt_refresh = new Virement; 
$vrt_refresh->get_by_id($li->vrt_id); 
echo $vrt_refresh->id; 

(顯然上面的代碼是不必要的,因爲你已經知道了$ VRT對象的ID,但是這是總的原則)。順便說一下,關於Datamapper的評論中對兩個新對象使用相同ID的說明,我會避免使用兩個對象的相同變量名;根據我的經驗,這將是不可靠的。相反,使用不同的變量名稱,或者(如果這是不可避免的),請查看「清除」方法:http://datamapper.wanwizard.eu/pages/utility.html#clear

相關問題