如何得到@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
下午好,请告诉我如何获取列数据:
{@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