2

从 symfony 4,我创建了一个示例存储库类。在这个类中,我创建了一个获取所有电子邮件用户列表的方法。我想得到一个这样的数组结构:

array(
    "email1",
    "email2",
    "email3",
    ...       
)

但是使用“getResult”我得到了一个多维数组。然后,我用 getArrayResult 和 getScalarResult 进行了测试,每次都得到完全相同的数组结构结果!

下面,我的服务类:

<?php
class UserRepository extends ServiceEntityRepository
{
    public function __construct(RegistryInterface $registry)
    {
        parent::__construct($registry, User::class);
    }

    public function getAllEmail(){
        $result = $this->createQueryBuilder('u')
            ->select(array('u.email'))
            ->setMaxResults(5)
            ->getQuery();
        return array( // getResult && getArrayResult && getScalarResult return exactly same array structure
            "getResult" => $result->getResult(),
            "getArrayResult" => $result->getArrayResult(), 
            "getScalarResult" => $result->getScalarResult(),
        );
    }
}

当我转储 "getAllEmail()" 的输出时的结果:

在此处输入图像描述

为什么 getResult/getArrayResult/getScalarResult 返回完全相同的数组结构?我在某处做错了吗?

编辑:我修改了我的存储库类:

public function getAllEmail(){
    $result = $this->createQueryBuilder('u','u.email')
        ->setMaxResults(5)
        ->getQuery();
    return array(
        "getResult" => $result->getResult(),
        "getArrayResult" => $result->getArrayResult(),
        "getScalarResult" => $result->getScalarResult(),
    );
}

和转储输出:

在此处输入图像描述

使用 'getResult' 和 'getArrayResult' 我得到一个多维数组,在第一维中,我得到所有电子邮件(电子邮件是关键)。我更接近我的目标,但它并不完美。我正在寻找“轻量级”的方式(对不起我的英语-_-),我想只收到电子邮件(而不是电子邮件+另一个无用的用户信息),因为我想执行尽可能简单的查询。可能吗 ?

4

3 回答 3

1

我可能会迟到,但需要进一步通知,我认为正确的答案已在此处描述。

您可以像这样使用getScalarResult()然后使用array_column

$emailArray = array_column($getScalarResult(), "email");
于 2018-11-27T09:44:56.283 回答
0

一旦你调用了 getResult,你就修复了 hydration 方法来告诉 Doctrine 返回对象。 有关更多讨论,请参阅此页面。

在我看来,一旦你从关系数据存储中获取了一个结果集,你可能会多次获取相同的结果并获得不同格式的数据,这是一个奇怪且相当不可预测的想法。

更好的测试是多次执行相同的查询,每次使用不同的结果格式。

于 2017-12-31T19:15:12.147 回答
0

解决方案是使用我自己的查询而不使用 createQueryBuilder :https ://symfony.com/doc/current/doctrine.html#querying-with-dql-or-sql

于 2017-12-31T20:11:37.117 回答