遵循 Doctrine 查询的关系

问题描述 投票:0回答:1

我尝试学习 Symfony 速成课程,但我被卡住了。结构相对简单,我有 3 个实体,设置如下:

PricingPlanBenefit
    name
        string
        50
        not-nullable
    
PricingPlanFeature
    name
        string
        50
        not-nullable
        
PricingPlan
    name
        string
        50
        not-nullable
    price
        integer
        not-nullable
    benefits
        OneToMany
        PricingPlanBenefit
        property:pricingPlan
        not-nullable
        not-deleteOrphaned
    features
        ManyToMany
        PricingPlanFeature
        not-property

现在我想在同一页面上显示所有 3 个页面,该页面看起来像引导定价页面。 https://getbootstrap.com/docs/5.3/examples/pricing/

<div class="row row-cols-1 row-cols-md-3 mb-3 text-center">
  {% for plan in plans %}
  <div class="col">
    <div class="card mb-4 rounded-3 shadow-sm">
      <div class="card-header py-3">
        <h4 class="my-0 fw-normal">{{plan.name}}</h4>
      </div>
      <div class="card-body">
        <h1 class="card-title pricing-card-title">${{plan.price}}<small class="text-body-secondary fw-light">/mo</small></h1>
        <ul class="list-unstyled mt-3 mb-4">
          {% for benefit in plan.benefits %}
          <li{{benefit.name}}</li>
          {% endfor %}
        </ul>
        <button type="button" class="w-100 btn btn-lg btn-outline-primary">Sign up for free</button>
      </div>
    </div>
  </div>
  {% endfor %}
</div>

这里的问题是我获得了 PricingPlan 的所有属性,但没有显示 PricingPlanBenefits。

#[Route('/pricing', name: 'pricing')]
public function index(): Response
{
    $plans = $this->doctrine
        ->getRepository(PricingPlan::class)
        ->findAll();
    dd($plans);
    return $this->render('pricing/index.html.twig', [
        'plans' => $plans,
    ]);
}

当我模具转储数据时,好处就不存在,并且集合没有初始化(我想应该是)。所以我想我需要某种急切的获取,或者我不知道它的正确术语是什么。 Doctrine 支持这种查询吗?

php symfony doctrine twig
1个回答
0
投票

HTML 格式错误:

<li{{benefit.name}}</li>

我修好了它,福利名称出现了

<li>{{benefit.name}}</li>

我检查了它,它没有进行急切加载,我对每个计划的好处进行了数据库查询。

我阅读了文档,根据它,对于单级深度,可以进行急切的获取。为此,我必须更改关系的获取模式。

#[ORM\OneToMany(mappedBy: 'pricingPlan', targetEntity: PricingPlanBenefit::class, fetch: "EAGER")]
private Collection $benefits;

重要的是,获取模式区分大小写,因此只有

fetch: "EAGER"
有效,而
fetch: "eager"
无效。

这样我就只有一个福利来加载所有 3 个计划的查询。

© www.soinside.com 2019 - 2024. All rights reserved.