2016-07-11 38 views
0

如果我取像一個對象,以便:使用Propel更新對象後可以保持水合嗎?

$q = OrderReturnQuery::create() 
    ->joinWith('Type') 
    ->joinWith('Status') 
    ->useStatusQuery() 
     ->joinWith('Email') 
     ->endUse() 
    ->joinWith('Priority'); 
$object = $q->findPk(1); 
var_dump($object->toArray(TableMap::TYPE_PHPNAME, true, [], true)); 

這是輸出我得到:

array (size=14) 
    'Id' => int 1 
    'TypeId' => int 3 
    'StatusId' => int 2 
    'PriorityId' => int 1 
    'OrderId' => int 234567 
    'CustomerId' => int 5 
    'Initiated' => string '2016-03-02T01:11:12+00:00' (length=25) 
    'Initiator' => int 2 
    'FreePostageLabel' => boolean true 
    'LostInPost' => boolean false 
    'SuppressEmail' => boolean true 
    'Type' => 
    array (size=4) 
     'Id' => int 3 
     'Title' => string 'title 3' (length=7) 
     'Priority' => int 3 
     'OrderReturns' => 
     array (size=1) 
      0 => string '*RECURSION*' (length=11) 
    'Status' => 
    array (size=6) 
     'Id' => int 2 
     'EmailId' => int 2 
     'Title' => string 'title 2' (length=7) 
     'Priority' => int 2 
     'Email' => 
     array (size=5) 
      'Id' => int 2 
      'Subject' => string 'subject 2' (length=9) 
      'Plaintext' => string 'plain text 2' (length=12) 
      'Html' => string 'html 2' (length=6) 
      'Statuses' => 
      array (size=1) 
       0 => string '*RECURSION*' (length=11) 
     'OrderReturns' => 
     array (size=1) 
      0 => string '*RECURSION*' (length=11) 
    'Priority' => 
    array (size=4) 
     'Id' => int 1 
     'Title' => string 'title 1' (length=7) 
     'Priority' => int 1 
     'OrderReturns' => 
     array (size=1) 
      0 => string '*RECURSION*' (length=11) 

現在,如果我修改的原代碼傾銷之前更改值:

$object = $q->findPk(1);¬ 
$object->setStatusId(5); 

生成的輸出不包含Status元素,只有'StatusId'。在使用toArray()之前,我當然可以用$object->getStatus()回來,但是有沒有辦法一般地做到這一點?

我想知道是否有辦法檢查一個值是否是一個外鍵,如果是這樣,我可以在設置該值後自動獲得getWhatevers(),而不是對它們進行硬編碼。或者也許有更好的方法?

我的其他選擇是覆蓋toArray,但必須考慮數據庫中的錯誤和維護數量變化的範圍。

回答

1

當你調用指定者方法的第四個參數可以爲了使模型設置爲true檢索相關對象

$object->toArray(TableMap:: TYPE_PHPNAME, true, [], true); 

編輯: 作爲@DarkBee在評論中指出的你在哪裏已經用正確的參數調用toArray,那麼爲什麼你沒有在數組表示中獲取相關對象? 答案可能駐留在你的代碼

$object->setStatusId(5) 

你實際上是在更新對象,而不更新數據庫相關記錄的這一步,這樣做的Propel無法檢索正確的相關對象,以避免這種行爲可以設置全狀態對象,而不是唯一的ID,如:

$object->setStatus(StatusQuery::create()->findPk(5)); 

這樣做,你會在你的數組表示正確的狀態對象的信息,請注意這一點(前面已經說了),大概,不反映數據庫狀態。

+1

OP已經在做 – DarkBee

相關問題