原则实体对象到数组

2022-08-30 19:57:23

想将教义 entiry 对象转换为普通数组,这是我到目前为止的代码,

 $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] => test@test.com
[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));

上面将返回一个数组,但包含教义对象。返回数组的最佳方法是使用 doctrine 查询。

希望这有帮助。干杯!


答案 2

注意:如果您想要实体的数组表示的原因是将其转换为JSON以进行AJAX响应,我建议检查此问答:如何在Symfony 2.0 AJAX应用程序中将 Doctrine实体编码为JSON?。我特别喜欢使用内置的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 )