条令告诉查询生成器防止延迟加载



我有两个实体ProductProvider,一个产品可以有多个提供商,所以在产品和提供商之间我有一对多的关系

Product:

/**
* @ORMEntity()
*/
class Product
{
/**
* @ORMId()
* @ORMColumn(type="integer")
*/
public int $id;
/**
* @ORMColumn(type="string", length=100)
*/
public string $name;

/**
* @ORMOneToMany(
*     targetEntity="AppEntityProvider",
*     mappedBy="product",
*     cascade={"persist", "remove"},
*     orphanRemoval=true
* )
*/
public Collection $providers;
public function __construct()
{
$this->providers = new ArrayCollection();
}
}

Provider:

/**
* @ORMEntity()
*/
class Provider
{
/**
* @ORMId()
* @ORMColumn(type="integer")
*/
public int $id;
/**
* @ORMColumn(type="boolean")
*/
public bool $available;

/**
* @ORMManyToOne(targetEntity="AppEntityProduct", inversedBy="providers")
* @ORMJoinColumn(name="product_id", referencedColumnName="id", nullable=false, onDelete="CASCADE")
*/
public Product $product;
}

我需要通过id和他所有可用的供应商获得产品,为此我有一个存储库和查询,如下所示:

class ProductRepository extends ServiceEntityRepository {
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Product::class);
}
public function getProductWithActionProviders(int $productId): Product
{
$qb = $this->createQueryBuilder('product')
->innerJoin('product.providers', 'pp')
->addSelect('pp');
$qb->where($qb->expr()->eq('pp.available', ':true'))
->setParameter('true', true, Types::BOOLEAN);
$qb->andWhere($qb->expr()->eq('product.id', ':productId'))
->setParameter('blueprintId', $productId, Types::INTEGER);
return $qb->getQuery()->getSingleResult();
}
}

因此,无论是否可用,它仍然返回所有提供程序,我不太确定,但我认为这是由于延迟加载和内部查询只返回可用的提供程序,但当我调用实体获取提供程序时,它延迟加载所有未提取的提供程序???以下是生成的SQL:

SELECT p0_.id                        AS id_0,
p0_.name                      AS name_1,
p1_.id                        AS id_11,
p2_.available                 AS available_19,
FROM products b0_
INNER JOIN providers p1_ ON p1_.product_id = p0_.id
WHERE p1_.available = ?
AND p0_.id = ?

如何防止加载不需要的提供程序???我知道我可以在关系描述中的实体中将加载策略设置为Eager,但我根本不想关闭它。非常感谢。

在您的代码中,您设置了一个blueprintId参数。是否复制过去的错误?

你可以这样简化你的代码:

public function getProductWithActionProviders(int $productId): Product
{
return $this->createQueryBuilder('product')
->select('product', 'providers')
->join('product.providers', 'providers')
->where('providers.available = 1')
->andWhere('product.id = :productId')
->setParameter('productId', $productId)
->getQuery()
->getSingleResult();
}

若数据库中的可用参数是布尔值,则可以在条件中使用0或1。

相关内容

  • 没有找到相关文章

最新更新