推进 - 合并收集

时间:2012-06-06 06:49:48

标签: collections propel

使用Propel ORM 1.5,我错过了合并两个PropelCollections的方法。

简短的提案可能是:

public function mergeCollection($collection){

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

所以我是Propel的新手我想问你,有没有更好的方法呢? 或者这个功能是否已包含在Propel中,但我还没有发现它?

1 个答案:

答案 0 :(得分:1)

邮件列表中似乎有discuted twice,但我找不到票证。

至少,您可以尝试使用此代码和/或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;
}