【问题标题】:Doctrine 2 - Access level problems when using Class Table InheritanceDoctrine 2 - 使用类表继承时的访问级别问题
【发布时间】:2011-09-26 17:09:25
【问题描述】:

我正在尝试在我的 Symfony 2 项目中实现 Class Table Inheritance Doctrine 2 提供的功能。 假设有一个 Pizza 类、Burito 类和一个 MacAndCheese 类,它们都继承自 Food 类。

Food 类具有以下设置:

<?php

namespace Kitchen;

use Doctrine\ORM\Mapping as ORM;

/** 
 * @ORM\Entity
 * @ORM\Table(name="food")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="dish", type="string")
 * @ORM\DiscriminatorMap({"pizza" = "Pizza", "burito" = "Burito", "mac" => "MacAndCheese"})
 */
class Food {

/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

并且继承的类有这些设置(例如Pizza):

<?php

namespace Kitchen;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="food_pizza")
 */
class Pizza extends Food {

当从 Symfony 2 应用程序/控制台运行 doctrine:schema:update --force 时,我收到一个关于 $id 子级访问级别的错误 Food(例如Pizza),说明它必须受到保护或更弱。我没有在 Pizza 的任何地方声明 $id,因为我认为它会继承自 Food

所以我尝试声明 $id,但这给了我一个错误,因为我无法重新声明 $id。 我想我需要从 Food in Pizza 中对 $id 进行某种引用,但 Doctrine 2 文档并没有真正给我一个明确的说明回答这会是什么样子。

希望你明白我的意思并能帮助我。

【问题讨论】:

    标签: php symfony doctrine doctrine-orm


    【解决方案1】:

    显然我应该多研究一下doctrine:generate:entities 生成的代码。当我今天早上启动我的 IDE 并再次查看代码时,我注意到它已经“复制”了所有继承的字段(如 Food 中的 $id /strong>,在上面的例子中)给孩子们(Pizza,在上面的例子中)。

    出于某种原因,它决定将这些字段设为私有。我在所有类中手动将访问级别更改为 protected 并尝试再次运行 doctrine:schema:update --force:它成功了!

    因此,在许多情况下,解决方案是好好休息一晚! ;)

    如果有人对此问题提出了更好的解决方案和/或解释,请张贴。我很乐意更改已接受的答案。

    【讨论】:

    • 您是说您的 IDE 是改变字段访问级别的那个吗?这有点可怕。您使用什么 IDE,这样我就可以留意这种情况?
    • @cantera25 不是 IDE,而是 Symfony 2 的教义:generate:entities 命令做到了。
    • 谢谢。它节省了我很多时间。
    • @ArnoMoonen 我认为没关系,因为 Food 的子级只能访问父级的 protectedpublic 属性。这就是为什么你需要定义protected 而不是private
    【解决方案2】:

    注意事项:

    每个实体都必须有一个标识符/主键。你不能生成 当前继承层次结构中的实体(测试版)作为一种解决方法 在为新实体生成方法时,我离开了项目 继承的实体,并在生成后将它们移回。

    source

    【讨论】:

    • 谢谢,但据我所知,这真的是关于生成实体,我只想生成我的数据库(也许这些方法在 Doctrine 2 内部是相关的,我不知道) .
    【解决方案3】:

    也许你应该这样定义@ORM\DiscriminatorMap:

    /**
     *
     ..
     * @ORM\DiscriminatorMap({"food" = "Food", "pizza" = "Pizza", "burito" = "Burito", "mac" => "MacAndCheese"})
     */
    

    如果您将您的代码与 Doctrine 站点中的示例进行比较,您会看到他们将父实体添加到 DiscriminatorMap。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      • 1970-01-01
      • 1970-01-01
      • 2017-04-16
      • 2015-07-01
      相关资源
      最近更新 更多