как преобразовать объект доктрины в json
Я использую доктрину 1.2, как я могу перевести объект запроса в формат json/массива?
$user = Doctrine_Query::create()
->select('u.id, u.username, u.firstname, u.lastname')
->from('User u')
->orderby('u.id')
->execute();
5 answers
Решением может быть использование toArray()
метод на объекте $user
, чтобы иметь простой массив, содержащий только интересующие вас данные, а затем использовать json_encode
чтобы преобразовать этот массив PHP в строку JSON.
Что-то вроде этого, я полагаю:
$user = Doctrine_Query::create()
->select('u.id, u.username, u.firstname, u.lastname')
->from('User u')
->orderby('u.id')
->execute();
$userArray = $user->toArray();
$json = json_encode($userArray);
( Не проверено, но это не должно быть слишком далеко от работы...)
Проблема с $record->exportto('json') заключается в том, что он будет экспортировать все поля записи . И в большинстве случаев это нежелательное поведение (например, когда этот фрагмент json должен быть передан браузеру). Один из способов ограничить область экспорта - указать поля в DQL select:
$user = Doctrine_Query::create()
->select('u.id, u.name')
->from('User u')
->addWhere('u.id = ?', $id)
->fetchOne();
$user_json = $user->exportTo('json');
$user_json тогда будет иметь что-то вроде этого:
{
"id": 123,
"name": "John Smith",
"password": null,
"deleted": null
}
Таким образом, он не предоставляет значение поля "пароль", но предоставляет базовую структуру базы данных. Опять же, может не быть тем, кем мы хотим. Что я делаю, так это указываю поля в DQL select +fetch как массив, а затем кодирую json:
$user = Doctrine_Query::create()
->select('u.id, u.name')
->from('User u')
->addWhere('u.id = ?', $id)
->fetchOne(array(), Doctrine::HYDRATE_ARRAY);
$user_json = json_encode($user);
В этом случае json будет выглядеть примерно так:
{
"id": 123,
"name": "John Smith"
}
$users2 = Doctrine_Query::create()
->select('u.id, u.username, u.firstname, u.lastname')
->from('User u')
->orderby('u.id');
$tmp2 = $users2->fetchArray();
Я не знаю, почему метод toArray() даст другое поле в таблице, например, он будет иметь поле "Пароль", кажется fetchArray() может дать мне правильные поля запроса.
ToArray()
Array
(
[0] => Array
(
[id] => 1
[username] => user1
[password] => password
[firstname] => John
[lastname] => Smith
)
Fetcharray()
Array
(
[0] => Array
(
[id] => 1
[username] => user1
[firstname] => John
[lastname] => Smith
)
Для JSON:
$user->exportTo('json');
;-)
Теперь Доктрина преобразований ORM отсутствует, она позволяет преобразовывать сущности в скалярные массивы и обратно
class User implements ITransformable {
use Transformable;
// ...
echo json_encode($user->toArray());