Хотите написать запрос возвращается как объект в Doctrine - PullRequest
0 голосов
/ 26 августа 2011

Просто напишите запрос, подобный этому:

$q = Doctrine_Query::create()
->select('r.title, r.title_safe, r.description')
->from('Regions r')
->where('pr.page_id = ?', 1)
->leftJoin('r.Page_regions pr');

$results = $q->execute(array(), Doctrine::HYDRATE_ARRAY);

, но я хочу $ результатов в виде объекта.Как я могу сделать?

Ответы [ 4 ]

1 голос
/ 26 августа 2011

Просто используйте метод execute без аргументов.

$ q-> Execute ();

0 голосов
/ 26 августа 2011

Я думал, что есть способ получить представление PDOStatement.Позвольте мне вернуться к вам об этом.

А вот и быстрое решение.Но это будет работать только с данными из реальной модели (данные отношений будут массивами объекта).

$objs = array();
foreach ($q->fetchArray() as $arr) {
    $objs = (object)$arr;
}

- Правка -

Не удалось найти его,Но вы можете просто расширить класс Doctrine_Query.

class App_Doctrine_Query extends Doctrine_Query
{
    public function fetchObjects(array $params = array())
    {
        return array_map(array($this, 'convertArrayToObject'), $this->fetchArray($params));
    }


    private function convertArrayToObject(array $arr)
    {
        $obj = new stdClass();

        foreach ($arr as $key => $val) {
            if (is_array($val)) {
                $val = $this->convertArrayToObject($val);
            }

            $obj->$key = $val;
        }

        return $obj;
    }
}

И в своем загрузчике вы добавите что-то вроде этого:

$manager = Doctrine_Manager::getInstance();
$manager->setAttribute(Doctrine_Core::ATTR_QUERY_CLASS, 'App_Doctrine_Query');
0 голосов
/ 26 августа 2011

Вы используете флаг HYDRATE_ARRAY, который возвращает все результаты в виде массивов.Вы можете опустить этот флаг, чтобы результаты возвращались как объекты.

Поскольку Doctrine_Query::execute() возвращает объект Doctrine_Collection, вы можете вызвать несколько методов для получения нужных результатов (см. Doctrine_Collection APIДокументация ).Если вам нужен только один результат, попробуйте что-то вроде этого:

$q = Doctrine_Query::create()
    ->select('r.title, r.title_safe, r.description')
    ->from('Regions r')
    ->where('pr.page_id = ?', 1)
    ->leftJoin('r.Page_regions pr');

    /* @var Doctrine_Record */
    $results = $q->execute()->getFirst();
0 голосов
/ 26 августа 2011
$q = Doctrine_Query::create()
->select('r.title, r.title_safe, r.description')
->from('Regions r')
->where('pr.page_id = ?', 1)
->leftJoin('r.Page_regions pr');

$q = $q->getQuery()->getResult();
...