使用Propel序列化完整的php对象

时间:2013-09-02 22:18:56

标签: php json serialization propel

我遇到了将两个查询的结果合并到一个json对象中的问题。

$item_results = ItemQuery::create('item')

    ->filterByCategory($categoryObjects, Criteria::IN)

    ->groupBy('item.ID')

    ->find();

返回类似

的对象
{"ID":35,"Title":"Individual Asset","Description":"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.","DateRecorded":"01\/02\/01"}

然后我想重新附上类别,以便我运行

    foreach($item_results as $item_result) {

        $categories = ItemCategoryQuery::create()
            ->filterByItem($item_result)
            ->find();
        $item_result->categories = Array();
        $item_result->categories = $categories->toArray();
        echo json_encode($item_result->toArray());

    }

但是我把它拿回来没有类别仍然......同样的json。所以我跑了

    var_dump($item_result);

然后回来了

object(Item)#39 (18) {
  ["id":protected]=>
  int(35)
  ["title":protected]=>
  string(16) "Individual Asset"
  ["description":protected]=>
  string(124) "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
  ["date_recorded":protected]=>
  string(10) "2001-01-02"
...
 ["categories"]=>
  array(2) {
    [0]=>
    array(2) {
      ["ItemID"]=>
      int(35)
      ["CategoryID"]=>
      int(19)
    }
    [1]=>
    array(2) {
      ["ItemID"]=>
      int(35)
      ["CategoryID"]=>
      int(15)
    }
  }

所以类别在新对象中它只是没有用它序列化...任何想法?

2 个答案:

答案 0 :(得分:1)

toArray()是Propel生成的方法,它将对象的所有受保护值都转换为数组。 它从模型 - 模式中获取数组的键。

如果要生成包含不存在字段的数组,可以手动将此值分配给数组

$result = $item_result->toArray();
$result['categories'] = $categories->toArray()

或重写toArray方法

答案 1 :(得分:0)

我知道这是一个非常古老的问题,但是我通过谷歌搜索发现它我认为写一个答案可能是值得的。

正如已经建议的那样,Propel会在它生成的每个模型上公开toArray方法,但该方法只会处理模式定义中定义的属性或集合(下一步更多)。

您尝试实现的是模型实例(来自ItemQuery :: find方法结果数组的元素)的序列化以及相关的类别集合。

Propel将基于关系的查询的结果存储到一个集合中,该集合是已进行查询的实例的受保护属性。 如果已从数据库加载某个关系的集合,则将包含在toArray方法结果中。

在Propel模型中,关系的填充/检索方法以get + related_model_name_pluralized的形式生成(如果关系为1:N)。

我认为一个例子可能比言语更有帮助。

foreach($item_results as $item_result) {
    $item_result->getItemCategories(); //This is the method that will
                                       //populate the collection.
    //Now the collection is populated so we can json_encode
    echo json_encode($item_result->toArray());
}