6

ActiveRecordオブジェクトの配列ではなく、単純な/連想配列としてPHP Activerecordの結果を返すことができる単純なメソッドが必要です。

Rubyでは、これはおそらく.map()メソッドで行われると思います。(私はRubyの男ではありません...)

私が欲しいのはtoArray()、foreach などではなく、Zend_DB_Table のような単純なメソッド呼び出しですが、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

明らかに、これは OP には関係ありません。ただし、これに対する解決策を見つけるのにまだ 1 時間以上かかった (php-activerecords docs のおかげではありません) ことを考えると、これは他の誰かを助けるかもしれません。

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

おそらく最もエレガントではありませんが、完璧に機能します。

于 2014-11-01T08:52:43.243 に答える
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

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

次のようにできます。

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プライベートである場合は、そのアクセサー メソッド (存在する必要があります) を as->getAttributes()または同等のものとして使用します。

于 2011-05-06T21:46:06.840 に答える