Объект объекта Doctrine для массива
Хочет преобразовать объект entrine объекта doctinary в обычный массив, это мой код до сих пор,
$demo = $this->doctrine->em->find('Entity\User',2);
Получение объекта объекта,
Entity\User Object
(
[id:Entity\User:private] => 2
[username:Entity\User:private] => TestUser
[password:Entity\User:private] => 950715f3f83e20ee154995cd5a89ac75
[email:Entity\User:private] => [email protected]
[firm_id:Entity\User:private] => Entity\Firm Object
(
[id:Entity\Firm:private] => 16
[company_name:Entity\Firm:private] => TestFirm
[company_detail:Entity\Firm:private] => India
[created_at:Entity\Firm:private] => DateTime Object
(
[date] => 2014-08-01 18:16:08
[timezone_type] => 3
[timezone] => Europe/Paris
)
[user:Entity\Firm:private] =>
)
[created_at:Entity\User:private] => DateTime Object
(
[date] => 2014-08-01 15:12:36
[timezone_type] => 3
[timezone] => Europe/Paris
)
[updated_at:Entity\User:private] => DateTime Object
(
[date] => 2014-08-01 15:12:36
[timezone_type] => 3
[timezone] => Europe/Paris
)
[firm:protected] =>
) ,
Пробовал этот, но в соответствии с моим требованием не хочу, чтобы пользователь doctrine_query.
Спасибо.
Ответы
Ответ 1
Вы можете попробовать что-то вроде этого,
$result = $this->em->createQueryBuilder();
$app_code = $result->select('p')
->from('YourUserBundle:User', 'p')
->where('p.id= :id')
->setParameter('id', 2)
->getQuery()
->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
Другой способ,
$this->em->getRepository('YourUserBundle:User')
->findBy(array('id'=>1));
Выше возвращается массив, но содержит объекты доктрины. Лучший способ вернуть массив - использовать запрос доктрины.
Надеюсь, это поможет.
Ура!
Ответ 2
Примечание. Если вы хотите получить представление массива объекта для преобразования его в JSON для ответа AJAX, я рекомендую проверить этот вопрос и ответ: как кодировать сущности Doctrine в JSON в приложении AJAX Symfony 2.0? , Мне особенно нравится использование встроенного интерфейса JsonSerializable, которое похоже на мой ответ.
Поскольку Doctrine не предоставляет способ преобразования сущностей в ассоциативные массивы, вам придется делать это самостоятельно. Один простой способ - создать базовый класс, который предоставляет функцию, которая возвращает представление объекта в виде массива. Это может быть достигнуто при наличии вызова функции базового класса get_object_vars
. Эта функция получает доступные свойства переданного объекта и возвращает их в виде ассоциативного массива. Тогда вам просто придется расширять этот базовый класс всякий раз, когда вы создаете сущность, которую хотите преобразовать в массив.
Вот очень простой пример:
abstract class ArrayExpressible {
public function toArray() {
return get_object_vars($this);
}
}
/** @Entity */
class User extends ArrayExpressible {
/** @Id @Column(type="integer") @GeneratedValue */
protected $id = 1; // initialized to 1 for testing
/** @Column(type="string") */
protected $username = 'abc';
/** @Column(type="string") */
protected $password = '123';
}
$user = new User();
print_r($user->toArray());
// Outputs: Array ( [id] => 1 [username] => abc [password] => 123 )
Примечание. Необходимо сделать свойства сущностей защищенными, чтобы базовый класс мог получить к ним доступ с помощью get_object_vars()
Если по какой-то причине вы не можете расширяться от базового класса (возможно, потому что вы уже расширяете базовый класс), вы можете по крайней мере создать интерфейс и убедиться, что ваши сущности реализуют интерфейс. Затем вам нужно будет реализовать функцию toArray
внутри каждой сущности.
Пример:
interface ArrayExpressible {
public function toArray();
}
/** @Entity */
class User extends SomeBaseClass implements ArrayExpressible {
/** @Id @Column(type="integer") @GeneratedValue */
protected $id = 1; // initialized to 1 for testing
/** @Column(type="string") */
protected $username = 'abc';
/** @Column(type="string") */
protected $password = '123';
public function toArray() {
return get_object_vars($this);
// alternatively, you could do:
// return ['username' => $this->username, 'password' => '****']
}
}
$user = new User;
print_r($user->toArray());
// Outputs: Array ( [id] => 1 [username] => abc [password] => 123 )
Ответ 3
Я новичок в Symfony, но есть некоторый рабочий (но странный) способ:
json_decode ($ this- > container- > получить ( 'сериализатору') → сериализации ($ сущность, 'JSON'))
Ответ 4
Я сделал рекурсивную функцию в своем репозитории несколько месяцев назад, но она не идеальна (например, если у вас есть поля createBy и updatedBy, он будет извлекать значение только для одного пользователя из-за довольно простой защиты от рекурсивности с помощью $ aClassNamesDone), но это может помочь:
public function entityToArray($entity, &$aClassNamesDone=array(), $latestClassName="") {
$result = array();
if(is_null($entity)) {
return $result;
}
$className = get_class($entity);
// init with calling entity
if(empty($aClassNamesDone)) {
$aClassNamesDone[] =$className;
}
$uow = $this->getEntityManager()->getUnitOfWork();
$entityPersister = $uow->getEntityPersister($className);
$classMetadata = $entityPersister->getClassMetadata();
//DEPENDS ON DOCTRINE VERSION
//if(strstr($className, 'DoctrineProxies\\__CG__\\')){
if(strstr($className, 'Proxies\\__CG__\\')){
$uow->initializeObject($entity);
}
foreach ($uow->getOriginalEntityData($entity) as $field => $value) {
if (isset($classMetadata->associationMappings[$field])) {
$assoc = $classMetadata->associationMappings[$field];
if (isset($classMetadata->columnNames[$field])) {
$columnName = $classMetadata->columnNames[$field];
$result[$columnName] = $value;
}
// to avoid recursivity we can look for the owning side (gives similar results as Query::HYDRATE_ARRAY):
// elseif($assoc['isOwningSide']) { ...
// or we can track entities explored and avoid any duplicates (this will however ignore some fields pointing to the same entity class)
// for example: only one of createdBy, updatedBy will be kept
else if(!in_array($assoc['targetEntity'], $aClassNamesDone) || $assoc['targetEntity'] == $latestClassName) {
try {
if ($assoc['targetEntity'] != 'Timestamp') {
$aClassNamesDone[] = $assoc['targetEntity'];
$targetClass = $this->getEntityManager()->getClassMetadata($assoc['targetEntity']);
if (($assoc['type'] == \Doctrine\ORM\Mapping\ClassMetadata::MANY_TO_MANY) || ($assoc['type'] == \Doctrine\ORM\Mapping\ClassMetadata::ONE_TO_MANY)) {
$getterName = 'get' . ucfirst($assoc['fieldName']);
$entityChildren = $entity->$getterName();
foreach ($entityChildren as $oneChild) {
$result[$assoc['fieldName']][] = $this->getEntityManager()->getRepository($assoc['targetEntity'])->entityToArray($oneChild, $aClassNamesDone, $assoc['targetEntity']);
}
} else if (($assoc['type'] == \Doctrine\ORM\Mapping\ClassMetadata::ONE_TO_ONE) || ($assoc['type'] == \Doctrine\ORM\Mapping\ClassMetadata::MANY_TO_ONE)) {
$getterName = 'get' . ucfirst($assoc['fieldName']);
$entityChild = $entity->$getterName();
$result[$assoc['fieldName']] = $this->getEntityManager()->getRepository($assoc['targetEntity'])->entityToArray($entityChild, $aClassNamesDone, $assoc['targetEntity']);
}
}
} catch (\Exception $e) {
//var_dump('No entityToArray for ' . $assoc['targetEntity']);
throw ($e);
}
}
}
}
return $result;
}
Ответ 5
Просто ты можешь использовать это
$demo=array($demo);
Ответ 6
Если вам просто нужно получить доступ к одному значению, вы также можете сделать это...
Если бы personType был объектом, и вы хотели бы установить значение отношения...
$personTypeId = $form->get('personType')->getViewData();