如何得到@ORM\index

How get @ORM\index

下午好,请告诉我如何获取列数据:

{@ORM\Index(name="localities_names_idx", columns={"name_ru", "name_cn", "name_en"} )

我尝试使用 queryBuilder :

$qb
    ->select('a')
    ->from(Locality::class, 'a')
    ->where('a.name_ru = :name_ru')
    ->andWhere('a.area is null')
    ->setParameter('name', 'Moscow');

$query = $qb->getQuery();

没有成功

我需要它用于:

$em = $this->entityManager;
$qb = $em->createQueryBuilder();
$qb
    ->select('a')
    ->from(Locality::class, 'a')
    ->where('a.name_ru = :name_ru')
    ->andWhere('a.area is null')
    ->setParameter('name', 'Москва');

$query = $qb->getQuery();
$result = $query->getResult(Query::HYDRATE_SCALAR);
$location = new Location();
$location->setLocality($result[0]['a_id']);
$location->setAddress($address);
$em->persist($location);
$em->flush();

return $location->getId();

编辑:这变成了评论,但最好保留在这里


您使用的 index 错误。

我猜你用错了。我假设您想要一个索引以加快搜索速度。但是,您现在的做法是创建一个组合索引。示例:

{@ORM\Index(name="thing_colour_idx", columns={"thing", "colour"})
Thing | Colour
--------------
Car    Blue
Car    Red
Bike   Green
Bike   Yellow

如果您总是(或至少大部分时间)select通过两者 列,例如,您 总是 搜索蓝色+汽车或绿色+自行车,而不是这样。
然而,如果你 select all Thing=Car, without colour,那么这个索引什么都不做。你想要这个:

indexes={
    @ORM\Index(name="thing_idx", columns={"thing"}),
    @ORM\Index(name="colour_idx", columns={"colour"})
}

您没有按预期使用 getResult

你做了 ->getResult(Query::HYDRATE_SCALAR),但随后又 ->setLocality($result[0]['a_id'])。除非你有性能问题,否则你不会使用 ID,这是 Doctrine 的问题,而不是你。你应该只关心对象:

$locality = $em
    ->createQueryBuilder()
    ->from(Locality::class, 'a')
    ->where('a.name_ru = :name_ru')
    ->andWhere('a.area is null')
    ->setParameter('name', 'Москва') // <- btw, this should be 'name_ru', same as two lines heigher
    ->getQuery()
    ->getSingleResult();

$location = new Location();
$location->setLocality($locality);

不要那样使用查询生成器,使用存储库

您现在将服务逻辑和查询逻辑放在一个代码中。那是不正确的。 Symfony 意图的一个例子:

class LocalityRepository extends ServiceEntityRepository{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, Locality::class);
    }

    public function getLocalityByRuName(string $name): Locality 
    {
        return $this->createQueryBuilder('a')
            ->where('a.name_ru = :name_ru')
            ->andWhere('a.area is null')
            ->setParameter('name_ru', $name);
            ->getQuery();
            ->getSingleResult();
    }
}

class YourService
{
    public function __construct(
        private LocalityRepository $localityRepository
    ){}

    public function somethingSomething()
    {
        $locality = $this->localityRepository->getLocalityByRuName('Москва');
        $location = new Location();
        $location->setLocality($locality);
    }
}

最后说明:尽量不要在服务中使用 ->flush()。服务的工作是做工作,而不是决定做什么。控制器决定什么时候完成。假设您有另一个服务,您可以在其中更改内容,但不想刷新它们。您现在不能再使用任何刷新的服务方法。

错误是没有名称属性 Ru