我尝试学习 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 支持这种查询吗?
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 个计划的查询。