2012-06-06 93 views
0

使用Propel ORM 1.5,我錯過了合併兩個PropelCollections的方法。Propel - 合併集合

短的建議可能是:

public function mergeCollection($collection){ 

    foreach($collection as $i => $item){ 
     if(! $this->contains($item)){ 
      // append item 
      $this->append($item); 
     } 
    } 
} 

所以,我是新來推進我想問問你,如果有更好的方法來做到這一點?
或者這個功能已經包含在Propel中,但我還沒有發現它?

回答

1

它似乎已在郵寄列表中discutedtwice,但我找不到票。

至少,您可以嘗試此代碼和/或open a ticket on Github

/** 
    * Add a collection of elements, preventing duplicates 
    * 
    * @param  array $collection The collection 
    * 
    * @return int the number of new element in the collection 
    */ 
    public function addCollection($collection) 
    { 
     $i = 0; 
     foreach($collection as $ref) { 
      if ($this->add($ref)) { 
       $i = $i + 1; 
      } 
     } 
     return $i; 
    } 

    /** 
    * Add a an element to the collection, preventing duplicates 
    * 
    * @param  $element The element 
    * 
    * @return bool if the element was added or not 
    */ 
    public function add($element) 
    { 
     if ($element != NULL) { 
      if ($this->isEmpty()) { 
       $this->append($element); 
       return true; 
      } else if (!$this->contains($element)) { 
       set_error_handler("error_2_exception"); 
       try { 
        if (!method_exists($element, 'getPrimaryKey')) { 
         restore_error_handler(); 
         $this->append($element); 
         return true; 
        } 
        if ($this->get($element->getPrimaryKey()) != null) { 
         restore_error_handler(); 
         return false; 
        } else { 
         $this->append($element); 
         restore_error_handler(); 
         return true; 
        } 
       } catch (Exception $x) { 
        //il semble que l'element ne soit pas dans la collection 
        restore_error_handler(); //restore the old handler 
        $this->append($element); 
        return true; 
       } 
       restore_error_handler(); //restore the old handler 
      } 
     } 
     return false; 
    } 

} 

function error_2_exception($errno, $errstr, $errfile, $errline,$context) { 
    throw new Exception('',$errno); 
    return true; 
} 
+0

好的,我發現這個代碼也通過搜索郵件列表。這似乎是做到這一點的方法!你有一個想法,關於如何將這些函數集成到現有項目中 - 防止手動更改PropelCollection類? – domi27

+0

好吧,我想這會讓整合這些功能變得複雜,而不會改變PropelCollection(可能是一個臨時修復程序,等待補丁被合併)。正如弗朗索瓦在ML上說的那樣,用單元測試來寫一個補丁,然後將它發佈到Propel Github上,那麼你的函數可能會在下一個Propel版本中結束。 – j0k