Получите результат PHPActiveRecord как простой массив, а не массив объектов - PullRequest
6 голосов
/ 07 мая 2011

Я хотел бы иметь простой метод, который может возвращать результаты PHP Activerecord в виде простых / ассоциативных массивов, а не массив объектов ActiveRecord.

В Ruby я считаю, что это возможно, возможно, методом .map(). (Я не Ruby парень ...)

Мне нужен простой вызов метода, например toArray() в Zend_DB_Table, а не foreach или что-то в этом роде, но я не могу найти его в их документах .

В 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
    )

Ответы [ 8 ]

7 голосов
/ 17 августа 2011

У меня была похожая проблема, надеюсь, это поможет кому-то еще, кто наткнется на нее.Очевидно, это относится к 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();
    }


}

Iзатем можно вызвать -> to_array () и получить обратно массив.

Надеюсь, это поможет!

4 голосов
/ 24 июля 2012

Я искал ответ на этот вопрос, чтобы получить массив результатов, которые можно было бы легко закодировать в 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.

1 голос
/ 12 мая 2014

Это мое решение:

<code>$posts = Post::find('all');

$arrayResult = array_map(function($res){
  return $res->attributes();
}, $posts);
printf('<pre>%s
', print_r ($ arrayResult, true));
1 голос
/ 07 мая 2011
class MyPHPActiveRecord extends PHPActiveRecord {

    public function toJSON() {
        return json_encode(get_object_vars($this));
    }
}
0 голосов
/ 01 ноября 2014

Очевидно, что это больше не относится к ОП; однако, учитывая, что мне все еще потребовалось более часа, чтобы найти решение для этого (нет, спасибо php-activerecords docs), это может помочь кому-то еще.

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

Возможно, не самый элегантный, но отлично работает.

0 голосов
/ 16 мая 2014

Мое решение:

  1. Добавлен следующий метод в класс utils, найденный в lib \ Utils.php

    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);
    
0 голосов
/ 08 февраля 2012

Я нашел это в поиске решения той же проблемы, с которой столкнулся при использовании инфраструктуры Yii - в Yii есть более простой способ сделать это.

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

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

Он печатает простой массив в соответствии с запросом:

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

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 07 мая 2011

Вы можете сделать это так:

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() или эквивалентный.

...