idiorm / paris has_many набор результатов as_array
У меня проблемы с получением результатов запроса has_many с использованием php idiorm/paris. Следуя примеру с сайта в Париже, результат has_many для сообщений возвращается как объект.
Это здорово, и я могу бегать по объектам и получать доступ к отдельным методам, но я хочу передать набор результатов в виде ассоциативного массива в мой механизм шаблонов для отображения.
Пример:
class Post extends Model {
}
class User extends Model {
public function posts() {
return $this->has_many('Post'); // Note we use the model name literally - not a pluralised version
}
}
API работает следующим образом:
// Select a particular user from the database
$user = Model::factory('User')->find_one($user_id);
// Find the posts associated with the user
$posts = $user->posts()->find_many();
Я могу получить доступ к объекту posts и напечатать результирующий набор следующим образом:
// echo each post id
foreach ($posts as $post) {
echo $post->id;
}
Что я действительно хотел бы сделать, так это использовать as_array(), чтобы получить весь набор результатов в виде ассоциативного массива, ограниченного определенными полями в способе работы as_array для отдельной строки, например
$post_list = $posts()->as_array(id,title,post,date);
Это или вызов чего-то вроде $user->posts()->find_many()->as_array() не работают.
Как правильно получить доступ к этому типу результатов с помощью Парижа?
2 ответа
Добавление этого метода в idiorm.php дает мне желаемую функциональность.
public function find_array() {
if (func_num_args() === 0) {
return $this->_run();
}
$args = func_get_args();
$array = array();
foreach ($this->_run() as $r) {
$array[] = array_intersect_key($r, array_flip($args));
}
return $array;
}
Теперь я могу вызвать $post_list = $posts()->find_array(); или $posts()->find_array('id','title'); и т.п.
find_one возвращает объект Model, find_many возвращает массив Models. Если вы хотите получить весь набор результатов в виде массива ассоциативного массива, одним из решений должно быть использование array_map
function model_as_array($model) {
return $model->as_array();
}
$posts = $user->posts()->find_many();
$my_view->posts = array_map(model_as_array, $posts);
var_dump($my_view->posts);
или в php 5.3+ (не тестировалось)
$aa_posts = array_map(function($model) {return $model->as_array();} , $posts);