symfony 6 / doctrine的问题优化:查询太多



使用symfony 6.0.8开发。

我有2个实体:utilisateur (user) &compte_client (customer) -由OneToOne关系链接,因为用户可能不是客户。用户可以是:雇员、合作伙伴或客户。外键在客户表中(compte_client ->utilisateur_id)

这里我想从用户谁也是客户恢复信息。我使用queryBuilder,我用这个恢复用户的信息:

$queryBuilder->andWhere('u.type_utilisateur = :val');
$queryBuilder->setParameter('val', $type);
$queryBuilder->join('u.compte_client','c')
->addSelect('c');
$queryBuilder->orderBy('u.login', 'ASC');
$query = $queryBuilder->getQuery();
$results = $query->getResult();
return $results;

我做了一个连接来限制查询的数量,但在这里,为了恢复2个用户的数据,它实现了7个查询。如果我删除连接请求,它会实现3个查询,但我认为它可以减少到1个查询(正如我在在线课程中看到的那样-也使用了连接请求)。

我试着在我的实体上添加一些属性,比如"fetch:EAGER"或"获取:EXTRA_LAZY"但这是无效的。

在这之前,我有类似的问题,从非客户的用户恢复数据。当我检查通过只加载员工用户的原则实现的查询时,尽管我没有尝试恢复任何客户信息,但他们对客户表的查询是如此无用,而且他们没有预期的结果。为了减少查询的数量,我必须添加这样一个连接请求:

$queryBuilder
->Where('u.type_utilisateur LIKE :type')
->setParameter('type', 'Entreprise%') 
->leftjoin('u.compte_client','c')
->addSelect('c')
->orderBy('u.login', 'ASC');
$query = $queryBuilder->getQuery();
$results = $query->getResult();
return results;

这个,reduce查询只在1。

那么是否有一些好的实践来优化根据原则生成的查询数量呢?

你必须把OneToOne原则看作一种继承形式:反面"继承";拥有方的属性(提醒:OneToOne关联的拥有方是包含外键的表的实体),所以当你获取反向时Doctrine总是获取拥有方。

这意味着这里的好做法是改变拥有方,因为customeruser继承更有意义。

最新更新