как преобразовать объект доктрины в json


Я использую доктрину 1.2, как я могу перевести объект запроса в формат json/массива?

$user = Doctrine_Query::create()
->select('u.id, u.username, u.firstname, u.lastname')
->from('User u')
->orderby('u.id')
->execute();
Author: amccausl, 2009-12-20

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

( Не проверено, но это не должно быть слишком далеко от работы...)

 29
Author: Pascal MARTIN, 2009-12-19 23:27:13

Проблема с $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"
}
 7
Author: Tadas Sasnauskas, 2011-09-12 10:15:29
$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
        )
 1
Author: cc96ai, 2009-12-19 23:39:59

Для JSON:

$user->exportTo('json');

;-)

 1
Author: inalgnu, 2010-12-06 12:45:59

Теперь Доктрина преобразований ORM отсутствует, она позволяет преобразовывать сущности в скалярные массивы и обратно

class User implements ITransformable {
    use Transformable;
// ...
echo json_encode($user->toArray());
 0
Author: ScorpioT1000, 2016-11-20 08:18:43