symfony propel:标准为addJoin的错误填充对象

时间:2012-08-30 15:17:14

标签: php symfony-1.4 criteria propel

这是我的第一个问题,所以请耐心等待我:)

我偶然发现填充对象的奇怪行为。

我开始将项目中使用的objectQuery::create()-> ... ->find()方法转换为$c = new Criteria(), $c-> ... objectPeer::doSelect($c),因为我被告知在条件可用时不应使用查询。

我有一个功能,它返回商店中商品的所有价格。或者至少做到了。我无法弄清楚的是:

旧代码:

static public function shopGetPrices($id){

    $prices = itemPriceQuery::create()->
        addJoin(itemPricePeer::ITEM_ID, itemPeer::ID, Criteria::LEFT_JOIN)->
        addJoin(itemPeer::CATEGORY_ID, categoryPeer::ID, Criteria::LEFT_JOIN)->
        addJoin(categoryPeer::SHOP_ID, shopPeer::ID, Criteria::LEFT_JOIN)->
        add(shopPeer::ID, $id)->find();

    return $prices;
}

返回正确填充的PropelObjectCollection对象,通过该对象我可以使用foreach,并获取/设置我需要的itemPrice对象和属性。

现在,新代码:

static public function shopGetPrices($id){

    $c = new Criteria();
    $c->addJoin(itemPricePeer::ITEM_ID, itemPeer::ID, Criteria::LEFT_JOIN)->
        addJoin(itemPeer::CATEGORY_ID, categoryPeer::ID, Criteria::LEFT_JOIN)->
        addJoin(categoryPeer::SHOP_ID, shopPeer::ID, Criteria::LEFT_JOIN)->
        add(shopPeer::ID, $id);

    return self::DoSelect($c);
}

返回itemPrice个对象的数组,但是它们通过join填充了与itemPrice对象相关的项值。这意味着:当我打电话给print_r(self::DoSelect($c));时,它会打印

 Array
 (
  [0] => ItemPrice Object
    (
        [startCopy:protected] => 
        [id:protected] => 47 <- id of joined item
        [item_id:protected] => 9 <-foreign key to category object of joined item
        [price:protected] => 0 
        [unit:protected] => Axe <- name of item, not unit (unit is like 'golden', 'iron', 'wood' or whatever )
        [active:protected] => 
        [collItemsOrder:protected] => 
        [collItemsOrderPartial:protected] => 
        [alreadyInSave:protected] => 
        [alreadyInValidation:protected] => 
        [polozkyObjednavkasScheduledForDeletion:protected] => 
        [prisadyPolozkyObjednavkasScheduledForDeletion:protected] => 
        [validationFailures:protected] => Array()
        [_new:protected] => 
        [_deleted:protected] => 
        [modifiedColumns:protected] => Array()
        [virtualColumns:protected] => Array()

    )

[1] => ItemPrice Object
    (

......等等。

标准和查询对象之间可能存在一些重要的区别,我很遗憾。我在谷歌,StackOverflow上搜索过,谁知道在哪里,但我没有发现任何类似解决方案。

guy/gal有一个模糊的问题,但我没有按照我的标准使用addSelectColumn,所以这对我来说是另一个死胡同。

任何人都可以指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

我发现了问题。我在do select

中覆盖了方法itemPricePeer
public static function doSelect(Criteria $criteria, PropelPDO $con = null){

    $critcopy = clone $criteria;
    $critcopy->add(self::ACTIVE, 1);

    return self::populateObjects(itemPeer::doSelectStmt($critcopy, $con));

}

我在self/itemPricePeer个参数中用itemPeer切换populateObjects。傻傻的我: - /谢谢你的反应,无论如何j0k。