6

我想要一个简单的方法,它可以将 PHP Activerecord 结果作为简单/关联数组返回,而不是 ActiveRecord 对象数组。

在 Ruby 中,我相信这可能是通过.map()方法完成的。(我不是红宝石人......)

我想要的是一个简单的方法调用,比如toArray()在 Zend_DB_Table 中,而不是 foreach 或类似的东西,但我似乎无法在他们的docs中找到它。

在 PHP ActiveRecord 中获得结果非常简单:

$settings = SystemSettings::all();

但它会返回如下内容:

[0] => SystemSettings Object
    (
        [errors] => 
        [attributes:ActiveRecord\Model:private] => Array
            (
                [param] => author
                [value] => Hawle
            )

        [__dirty:ActiveRecord\Model:private] => Array
            (
            )

        [__readonly:ActiveRecord\Model:private] => 
        [__relationships:ActiveRecord\Model:private] => Array
            (
            )

        [__new_record:ActiveRecord\Model:private] => 
    )

[1] => SystemSettings Object
    (
        [errors] => 
        [attributes:ActiveRecord\Model:private] => Array
            (
                [param] => base_url
                [value] => example.com
            )

        [__dirty:ActiveRecord\Model:private] => Array
            (
            )

        [__readonly:ActiveRecord\Model:private] => 
        [__relationships:ActiveRecord\Model:private] => Array
            (
            )

        [__new_record:ActiveRecord\Model:private] => 
    )

虽然这在很多情况下真的很棒,但在这里,我只想有一个简单的数组,如下所示:

Array
    (
        [author] => Hawle
        [base_url] => example.com
    )
4

8 回答 8

7

我有一个类似的问题,希望这可以帮助其他偶然发现它的人。显然,这是特定于 phpactiverecord.org 的。

在 /lib/Model.php 我添加了以下函数:

public function to_array(array $options=array())
{
    return $this->serialize('array', $options);
}

在 /lib/Serialization.php 我添加了以下类

class arraySerializer extends Serialization
{
    public static $include_root = false;

    public function to_s()
    {
        return self::$include_root ? array(strtolower(get_class($this->model)) => $this->to_a()) : $this->to_a();
    }


}

然后我可以调用 ->to_array() 并取回一个数组。

希望这可以帮助!

于 2011-08-17T15:45:04.680 回答
4

我正在寻找这个问题的答案,以便生成可以轻松进行 json 编码并作为对 ajax 调用的响应发送的结果数组。我只想要结果数组中每个对象的属性。

不幸的是,您不能只对每个结果调用 to_json() ,然后对整个结果进行 json 编码;你最终得到双重编码。不过幸运的是,@willwashburn 发布的用于解决此问题的函数和类现在已包含在 php-activerecord 中,尽管它们似乎并未将其纳入在线文档。

要返回结果数组,请执行以下操作:

$data = MyModel::find('all');
foreach ($data as &$result) {
    $result = $result->to_array();
}

您的整个结果集现在将是一个数组数组,仅包含每个对象的属性。然后你可以做类似的事情

echo(json_encode($data));

如果您想将其作为对 ajax 调用的响应发送。

于 2012-07-23T21:36:06.257 回答
2

这是我的解决方案:

$posts = Post::find('all');

$arrayResult = array_map(function($res){
  return $res->attributes();
}, $posts);
printf('<pre>%s</pre>', print_r($arrayResult, true));
于 2014-05-12T16:09:33.027 回答
1
class MyPHPActiveRecord extends PHPActiveRecord {

    public function toJSON() {
        return json_encode(get_object_vars($this));
    }
}
于 2011-05-06T22:16:16.860 回答
0

你可以这样做:

funciton ar2array($settings){
   $arr = array();
   foreach($settings as $fieldObj){
      $fieldName = $fieldObj->attributes["param"];
      $fieldValue = $fieldObj->attributes["value"];
      $arr[$fieldName] = $fieldValue;
   }
   return $arr;
}
$resultAsYouWant = ar2array($settings);

希望这可以帮助。干杯

PS:如果->attributes是私人使用它的访问方法(必须有一个)作为->getAttributes()或等效。

于 2011-05-06T21:46:06.840 回答
0

我发现这是在寻找我在使用 Yii 框架时遇到的相同问题的解决方案 - 在 Yii 中有更简单的方法可以做到这一点。

$posts = Posts::model()->findAll();

foreach($posts as $result)
{
    print_r($result->attributes);
}

它根据要求打印简单的数组:

Array
(
    [id] => 1
    [title] => Title
    [text] => Text
)

希望它可以帮助某人。

于 2012-02-08T09:45:07.517 回答
0

我的解决方案:

  1. 在 lib\Utils.php 中的 utils 类中添加了以下方法

    public static function results_to_json($data)
    {
    $arr = array();
    if(count($data)>0){
        foreach($data as $row){
            array_push($arr, $row->to_array());
        }
    }
    return json_encode($arr);
    }
    
  2. 致电:

    echo \ActiveRecord\Utils::results_to_json($dataobject);
    
于 2014-05-16T17:20:36.487 回答
0

显然,这不再与 OP 相关;但是,考虑到我仍然花了一个多小时才找到解决方案(不感谢 php-activerecords 文档),这可能对其他人有所帮助。

 $r = Model::find('$id')->attributes();
 $a = [];
 foreach ($r as $k => $v)
 {
     $a[$k] = $v;
 }

也许不是最优雅的,但效果很好。

于 2014-11-01T08:52:43.243 回答