属性 ... 也不是其中一种方法

Neither the property ... nor one of the methods

具有一对一关系的两个实体 第一个是 table 第二个是视图

细胞核

/**
 * Nuclei
 *
 * @ORM\Table(name="datinuclei")
 * @ORM\Entity(repositoryClass="App\Repository\NucleiRepository")
 */
class Nuclei
{
    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\GeneratedValue(strategy="NONE")
     */
    private $id;

    /**
     * @var NucleiStatistiche
     *
     * @ORM\OneToOne(targetEntity="NucleiStatistiche", fetch="EAGER")
     * @ORM\JoinColumn(name="id", referencedColumnName="id", nullable=false)
     */
    private $statistiche;

核统计

/**
 * NucleiStatistiche
 *
 * @ORM\Table(name="nuclei_001")
 * @ORM\Entity()
 */
class NucleiStatistiche
{
    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\GeneratedValue(strategy="NONE")
     */
    private $id;


    /**
     * @var string
     *
     * @ORM\Column(name="totale_conferimenti", type="integer", nullable=false)
     */
    private $totale_conferimenti;

    /**
     * @var string
     *
     * @ORM\Column(name="totale_indifferenziata", type="integer", nullable=false)
     */
    private $totale_indifferenziata;

    /**
     * @var string
     *
     * @ORM\Column(name="percentuale_indifferenziata", type="integer", nullable=false)
     */
    private $percentuale_indifferenziata;


    public function getTotaleConferimenti(): ?string
    {
        return $this->totale_conferimenti;
    }

    public function getTotaleIndifferenziata(): ?string
    {
        return $this->totale_indifferenziata;
    }

    public function getPercentualeIndifferenziata(): ?string
    {
        return $this->percentuale_indifferenziata;
    }

使用

在控制器上进行测试
$this->getDoctrine()->getRepository(Nuclei::class)->findBy(
        array('comune' => $this->id_comune, 'id' => '14523')
    );

{% for nucleo in nuclei %}
    {{ dump(nucleo.statistiche) }}
{% endfor %}

App\Entity\NucleiStatistiche {#925 ▼
  -id: 14523
  -totale_conferimenti: 107
  -totale_indifferenziata: 2
  -percentuale_indifferenziata: 2
}

我可以使用转储查看值,但是当将 属性 引用到 twig 中时,我收到错误消息

{% for nucleo in nuclei %}
    {{ dump(nucleo.statistiche.totale_conferimenti) }}
{% endfor %}

既不是 属性 totale_conferimenti 也不是其中一种方法 totale_conferimenti()gettotale_conferimenti()/istotale_conferimenti()/hastotale_conferimenti()__call() 存在 并在 class App\Entity\NucleiStatistiche.

中具有 public 访问权限

我不明白解决方案是什么...疯了!!!

公理:在你理解之前,一切都很困难。

我们首先需要了解其工作原理。在 PHP 中,private/protected 表示它们在对象范围之外不可用。 Twig 尝试从对象范围之外访问它们,这导致了问题。

换句话说:您的 Twig 尝试使用的内容对它不可用。

但是,我确定您已经看到 Twig 似乎使用 private/protected 成员,因此您的经验证据似乎与我概述的理论相矛盾。但也只是表面上的。您了解问题所在,但此时您还不了解如何使用这些关键字。

documentation 很清楚,当它解释说当使用 foo.bar 时,如果 bar 不是 foo 的成员,那么它最终会检查 foo.getBar( ), 一个 getter。因此,您将需要实施 getStatistiche 并对其成员进行类似操作。我有一段时间没有使用 Twig,但如果我没记错的话,totale_conferimenti 你将需要 getTotaleConferimenti.

编辑(Jakumi 的有用评论):

你大约有 90% 是对的。 Symfony 通常采用驼峰式大小写,在这种情况下,您假定的 getter 名称是正确的。错误消息指出了预期的 getter 名称。还有其他方便的信息:dump 的输出有一个 - 前置到每个 private/inaccessible 属性 和 + 前置到每个 public 属性。然而,诊断是 100% 正确的,因为“无法访问”属性 而缺少 getter,并且没有可能的回退。