Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 动态目标实体条令2和Symfony 2_Php_Symfony_Doctrine Orm - Fatal编程技术网

Php 动态目标实体条令2和Symfony 2

Php 动态目标实体条令2和Symfony 2,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我想要一个实体上的动态实体映射,它将被其他实体使用。例如,我有一个文件实体,它将存储MIME类型、映射键、名称等,还有一个实体id,它将包含它所属实体的id。映射键将确定类,因为此文件实体将是多对多的。因此,文件实体的targetEntity不是固定的。如何做到这一点 文件实体 <?php namespace AppBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * File * * @ORM\Entity */ cla

我想要一个实体上的动态实体映射,它将被其他实体使用。例如,我有一个文件实体,它将存储
MIME
类型、映射
名称
等,还有一个
实体id
,它将包含它所属实体的id。映射
将确定类,因为此文件实体将是多对多的。因此,文件实体的
targetEntity
不是固定的。如何做到这一点

文件实体

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * File
 *
 * @ORM\Entity
 */
class File {
    //.... Other mapping properties

    /**
     * @ORM\ManyToOne(targetEntity="SuperClass", inversedBy="files")
     * @ORM\JoinColumn(name="entity_id", referencedColumnName="id", onDelete="CASCADE")
     */
    protected $entity;
}

但是我还有许多类似于
产品的其他实体
,我如何确保在调用
getFiles()
时,我得到相应实体的文件。我认为它可能是这样工作的,但这是正确的方法,还是有更好的方法?

好的,这是我遇到的一个非常常见的问题-如何将一个实体链接到许多其他非常相似的实体

首先,重新评估:我经常发现,我实际上并不需要那么多不同的实体,通过简化所有内容,它们可以合并成一个实体。当我们真的不需要(甚至不应该)的时候,我们经常过度设计和过度复杂化

如果这不是一个选项: 在文件和所有其他(相关)实体之间创建单独的关系。是的,您的文件实体将充满关系。然后编写一个通用访问getter,计算它连接到哪个实体并返回它(通过遍历所有连接,或者通过从其他参数(如您的例子中的mime类型)计算它,它可以更复杂[更快]。 通过这种方式,您可以对代码的其余部分隐藏所有这些关系的复杂性

如果你只需要一个足够好的解决方案,这个选项就可以使用。更正确的方法是放弃条令关系,在两个字段中跟踪ID和相关的实体类,并自己选择和实例化对象(当然是在实体中)。但这更复杂,更容易出错


如果你能找到一种更优雅、更有教条支持的方法,请让我(和我们其他人)来做知道。

我发现,根据我的要求,我可以处理很多单向或一个一个单向。但对于双向,似乎没有解决方案。我有一些想法,但这只会使场景复杂化。根据理论文档,生成的模式将是

CREATE TABLE Product (
    id INT AUTO_INCREMENT NOT NULL,
    PRIMARY KEY(id)
) ENGINE = InnoDB;

CREATE TABLE Feature (
    id INT AUTO_INCREMENT NOT NULL,
    product_id INT DEFAULT NULL,
    PRIMARY KEY(id)
) ENGINE = InnoDB;

ALTER TABLE Feature ADD FOREIGN KEY (product_id) REFERENCES Product(id);

因此,正如我在问题中提出的扩展超类的建议,如果超类本身是一个实体,有自己的表,包含一个存储库路径的字段,并且以某种方式将其处理以返回正确的实体,该怎么办?

创建一个超类以获得更好的答案。当然,我希望现在我已经使用正确的信息进行了编辑。我刚刚更新了我的问题有了一个可能的解决方案,我想到了这个方法,但我还没有尝试过这个方法是否有效。我会的,但我认为它不起作用,超类将不包含表细节。我还想设置“+”对于这些词,如果你能找到一种更优雅的方式,请让我们知道。因为现在要设置许多关系-这真的让我很痛苦。我不明白为什么ORM没有与ODM中的相同,比如特定字段的鉴别器类型,它描述了如何解析为多个实体…我充满了pain关于这个东西。我的案例:我有一个用于所有实体的转换表,我不能将所有实体都连接到一个表中。我需要创建所有关系,这要感谢@Putr me的建议。对我的案例有什么想法吗?@Nikita_kharkov_ua ORM不能使用像
discriminator
这样的字段,因为底层DBMS应该有foreig链接表的n键。Discriminator不允许这样做,因为它更类似于多态关系。MongoDB根本没有外键的概念,在不久的将来也不可能有外键。至于我使用的解决方案,我有一个“标签”可以从任何其他实体链接但没有双向关联的实体,即标记不知道它链接到什么(您仍然可以使用
QueryBuilder
查询它)
CREATE TABLE Product (
    id INT AUTO_INCREMENT NOT NULL,
    PRIMARY KEY(id)
) ENGINE = InnoDB;

CREATE TABLE Feature (
    id INT AUTO_INCREMENT NOT NULL,
    product_id INT DEFAULT NULL,
    PRIMARY KEY(id)
) ENGINE = InnoDB;

ALTER TABLE Feature ADD FOREIGN KEY (product_id) REFERENCES Product(id);