【问题标题】:Symfony 4, findAll with entity's property as array keySymfony 4,以实体属性作为数组键的 findAll
【发布时间】:2018-09-21 15:53:27
【问题描述】:

从 symfony 4 开始,当我使用 findAll 方法时,我得到一个实体对象的关联数组,其中每个键都是我实体的一个对象

我正在寻找一种漂亮的方法来获取关联数组,其中键是我的实体的特定字段的值,而值是我的实体的对象。

实际上,当我使用 findAll 时,我得到了这个:

Array
(
    [0] => App\Entity\Foo Object
        (
            [id:App\Entity\Foo:private] => 1
            [name:App\Entity\Foo:private] => nameValue1
        )

    [1] => App\Entity\Foo Object
        (
            [id:App\Entity\Foo:private] => 2
            [name:App\Entity\Foo:private] => nameValue2
        )

    [2] => App\Entity\Foo Object
        (
            [id:App\Entity\Foo:private] => 3
            [name:App\Entity\Foo:private] => nameValue3
        )
        ...
)

但是,相反,我想要这个:

Array
(
    ["nameValue1"] => App\Entity\Foo Object
        (
            [id:App\Entity\Foo:private] => 1
            [name:App\Entity\Foo:private] => nameValue1
        )

    ["nameValue2"] => App\Entity\Foo Object
        (
            [id:App\Entity\Foo:private] => 2
            [name:App\Entity\Foo:private] => nameValue2
        )

    ["nameValue3"] => App\Entity\Foo Object
        (
            [id:App\Entity\Foo:private] => 3
            [name:App\Entity\Foo:private] => nameValue3
        )
        ...
)

【问题讨论】:

    标签: symfony doctrine-orm symfony4


    【解决方案1】:

    要获得此功能,您必须在 Foo 类的存储库中实现自己的函数并使用 QueryBuilder 的 indexBy()

    <?php
    
    namespace App\Repository;
    use Doctrine\ORM\EntityRepository;
    
    class FooRepository extends EntityRepository
    {
    
        public function findAllIndexed()
        {
            $qb = $this->createQueryBuilder('foo');
            $query = $qb->indexBy('foo', 'foo.name')->getQuery();
            return $query->getResult();
        }
    }
    

    现在您只需调用 $repository-&gt;findAllIndexed() 而不是 $repository-&gt;findAll() 函数。

    【讨论】:

    • 这看起来很完美!谢谢 :) 但是,当我调用 findAllIndexed 时收到通知警告,通知是“通知:未定义偏移量:1”,有问题吗?
    • 这似乎与 findAllIndexed 函数无关。请使用转储($query->getResult());在 findAllIndexed() 中的 return 语句之前,以便您可以准确地看到该函数返回的内容。
    • 这个通知来自我代码的另一个位置,那是我的错!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2022-01-11
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多