我想有一个简单的方法,它可以将PHP Activerecord结果作为简单/关联数组返回,而不是ActiveRecord对象数组。
在Ruby中我相信这可能是用.map()
方法完成的。 (我不是Ruby家伙......)
我想要的是一个简单的方法调用,例如Zend_DB_Table中的toArray()
,而不是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
)
答案 0 :(得分: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()并返回一个数组。
希望这有帮助!
答案 1 :(得分: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调用的响应发送。
答案 2 :(得分:1)
class MyPHPActiveRecord extends PHPActiveRecord {
public function toJSON() {
return json_encode(get_object_vars($this));
}
}
答案 3 :(得分:1)
这是我的解决方案:
$posts = Post::find('all');
$arrayResult = array_map(function($res){
return $res->attributes();
}, $posts);
printf('<pre>%s</pre>', print_r($arrayResult, true));
答案 4 :(得分: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()
或等效。
答案 5 :(得分:0)
我发现这找到了我使用Yii框架遇到的同样问题的解决方案 - 在Yii中有更简单的方法。
$posts = Posts::model()->findAll();
foreach($posts as $result)
{
print_r($result->attributes);
}
按要求打印简单数组:
Array
(
[id] => 1
[title] => Title
[text] => Text
)
希望它对某人有帮助。
答案 6 :(得分:0)
我的解决方案:
在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);
}
致电:
echo \ActiveRecord\Utils::results_to_json($dataobject);
答案 7 :(得分:0)
显然这与OP不再相关;但是,考虑到我花了一个多小时才找到解决方案(不用感谢php-activerecords docs),这可能对其他人有帮助。
$r = Model::find('$id')->attributes();
$a = [];
foreach ($r as $k => $v)
{
$a[$k] = $v;
}
也许不是最优雅的,但效果很好。