【问题标题】:Symfony 5 referencing a field within a referenced tableSymfony 5 引用引用表中的字段
【发布时间】:2020-12-28 12:34:04
【问题描述】:

当我没有准备好使用的确切术语时,很难用一句话来表达这个问题,但我基本上正在从事一个涉及 MySQL 数据库的 Symfony 5 项目。我使用 Twig 允许在我的 PHP 控制器和我的 HTML 界面之间进行通信。到目前为止,我在 Twig 中使用对实体字段的简单引用一直做得很好,例如:

myEntity.someField

为了得到我需要的价值。但是,我目前需要像这样引用“嵌套”字段:

myEntity1.myEntity2Field.someField

“嵌套”使两者之间的世界变得不同。我现在在尝试执行此操作时遇到错误 (Impossible to access an attribute ("someField") on a string variable ("<value from entity2 field>")), 据我了解,可能是因为我的数据库还没有正确组织。希望你能理解我的困难。那么,如何调整我的数据库以允许发生这种双重引用?

注意:myEntity2Field 指的是来自Entity2 的字段的名称,它应该作为对整个Entity2 表的引用,然后可以从中提取someField。

【问题讨论】:

  • 错误信息是什么?
  • @hous 对,我编辑了我的原始帖子以包含它
  • 你在使用 Doctrine 吗?您是否在 entity1 和 entity2 之间设置了relation?在 twig 中你会有类似的东西: entity1.entity2.someEntity2Property 将转换为 $entity1->getEntity2()->getSomeProperty()。
  • @Cerad 我确实也在使用 Doctrine,但我所知道的 entity1 和 2 之间没有关系。我看看能不能试试你说的方法

标签: php mysql database symfony


【解决方案1】:

你得到的错误是因为你试图从一个字符串或整数中访问一个值,而不是一个对象。

myEntity.someField 与 $myEntity->getSomeField() 相同(如果您有 getter 方法)或 $myEntity->someField(如果您直接访问属性)。

如果 someField 值不是对象,则只能访问该值,但如果它是对象,则可以通过这种方式访问​​其他对象的属性和方法。

要做到这一点,最好的方法是在您的实体之间使用关联(关系),如果您已经在数据库中拥有关联并且如果您在数据库中建立您的关系,那么您必须引用这个关系或关联您的实体和教义将为您完成其余的工作。 例如:

    <?php
/** @Entity */
class User
{
    // ...

    /**
     * @ManyToOne(targetEntity="Address")
     * @JoinColumn(name="address_id", referencedColumnName="id")
     */
    private $address;
}

/** @Entity */
class Address
{
    private $street;
    
    public function getStreet(){
     ....
    }

}

这个例子是用户和地址实体之间的多对一关系,在用户实体中使用 getters 方法,您可以在访问用户时使用嵌套:

$user->getAddress()->getStreet()

作为一个例子,这也适用于树枝:

{{user.address.street}}

https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/association-mapping.html#many-to-one-unidirectional

另一种方法是您可以在您的 cals 中获取对象并使用方法对其进行映射,以便您可以随意访问它。

我希望我能帮助您了解这些信息。

【讨论】:

  • 谢谢你,这主要是为我做的。我的意思是添加这个 ManyToOne 关系使我能够以正确的方向构建我的程序,但是由于我还不是所有方面的专家,我仍然在这个过程中遇到了看似不致命的错误。多亏了这个,我的项目进展顺利!
猜你喜欢
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多