【问题标题】:symfony entity OneToOne error when updating schemasymfony 实体 OneToOne 更新架构时出错
【发布时间】:2014-01-08 18:51:18
【问题描述】:

当我尝试通过 ID 查找 Miejsce 实体时:

$m= $this->getDoctrine()
            ->getRepository('MiejsceObiektyBundle:Miejsce')
            ->find($id);

我得到这个错误:

注意:未定义的索引:id in 供应商/学说/orm/lib/Doctrine/ORM/AbstractQuery.php 第 286 行 500 内部服务器错误 - ContextErrorException

想法和现实的联系是

where subdomain.rid=miejsce.id and subdomain.ridType=1

子域适用于许多实体 - 所以我不希望从子域到 miejsce 的学说 var。

ridType=1 = miejsce
ridType=2 = product
ridType=3 = other 

我可以在存储库中添加条件 subdomain.ridType=1 - 但设置连接 subdomain.rid=miejsce.id 存在问题,因为 miejsce 没有子域的 id 参考 - 它不需要子域,但不仅适用于 miejsce。 ... :)

这个想法有什么问题?可以在学说中使用吗?

Miejsce实体:

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

 /**
     * @ORM\OneToOne(targetEntity="Miejsce\DomainBundle\Entity\Subdomains")
     * @ORM\JoinColumn(name="id", referencedColumnName="rid")
     * @var Subdomains
     */
    protected $subdomain;

Subdomain实体:

class Subdomains
{



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

    /**
     * @ORM\Column(type="string")
     * @var string
     */
    private $name;

    /**
     * @ORM\Column(type="integer")
     * @var integer
     */
    private $rid;

    /**
     * @ORM\Column(type="integer")
     * @var integer
     */
    private $ridType;

【问题讨论】:

    标签: php symfony orm doctrine-orm


    【解决方案1】:

    Miejsce实体中:

    /**
     * @ORM\OneToOne(targetEntity="Subdomains", mappedBy="miejsce")
     */
    private $subdomain;
    

    Subdomains实体中:

    /**
     * @ORM\OneToOne(targetEntity="Miejsce", inversedBy="subdomain")
     * @ORM\JoinColumn(name="rid", referencedColumnName="id")
     */
    private $miejsce;
    

    还将 Subdomains 重命名为 Subdomain - 实体名称应该是单数

    【讨论】:

    • 这是我想要的,但不完全是。子域实体有很多连接 - miejsce 和其他实体,因此将 miejsce 添加到子域很复杂 :) 所以可能无法设置这个想法
    • 它的 OneToOne 关系,所以 Miejsce 有 Subdomain 并且 Subdomain 有 Miejsce - 这两个实体中都需要有相应的变量。请注意,仅当您调用 getMiejsce() 时才会获取 $miejsce(如果您将创建该方法)。如果您不使用它,它不会影响性能。在 Miejsce 中也不需要 subdomain_id
    • 也许在学说中存在其他类型的关系,我可以在这种情况下使用?我不必添加系统不需要但教义重复键需要的额外内容?
    • 也许你需要单表继承。您的 DiscriminatorColumn 将是 ridType: http://stackoverflow.com/questions/15344426/multiple-joincolumns-in-symfony2-using-doctrine-annotations
    【解决方案2】:

    试试这个:

     * @ORM\JoinColumn(name="subdomain_id", referencedColumnName="rid")
    

    【讨论】:

    • 添加新列 subdomain_id ?在 miejsce 中没有行 subdomain_id 连接是 miejsce.id = subdomain.rid
    • 看看 :docs.doctrine-project.org/en/2.0.x/reference/… 不需要那个字段,它将用于参考列。更新架构后,它将在您的表中生成一列。
    • 但这不是自我参考
    • 有可能像我一样有参考 - miejsce.id = subdomain.rid 吗?当我添加 @ORM\JoinColumn(name="subdomain_id", referencedColumnName="rid") docrine 时,将密钥 subdomain_id 添加到 miejsce
    • referencedColumnName 应该是 id
    猜你喜欢
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 2011-12-19
    • 1970-01-01
    相关资源
    最近更新 更多