如何在 Doctrine 中建立多对一关系?

Posted

技术标签:

【中文标题】如何在 Doctrine 中建立多对一关系?【英文标题】:How to set up a Many-To-One Relation in Doctrine? 【发布时间】:2019-01-25 12:59:12 【问题描述】:

我正在 Doctrine 中设置一个新数据库,我想使用 Many-To-One 关系。 数据库运行良好,但我无法对这些类使用查询。

我遵循了这些文档:

/**
 * @Entity @Table
 **/
class Section

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

     //... 

     /**
     * @ManyToOne(targetEntity="Manufacturer")
     */
    private $manufacturer;

    //...


/**
 * @Entity
 **/
class Manufacturer
   
    /**
     * @Id @Column(type="integer") @GeneratedValue
     **/
    protected $id;  
    //...

所以我的问题是,我不能对Section 使用任何查询。

为了测试,我有这个小程序:

$relation = 'Section';

$rep = $entityManager->getRepository($relation); //here is the problem

$result = $rep->findAll();

foreach ($result as $row) 
    echo $row->getName();

如果我将$relation 更改为'Manufacturer' 它正在工作,或者如果我使用另一个关系(One-To-OneMany-To-Many),它也很好。但我不能使用Many-To-One(或One-To-Many bidirectional)。 手动 DQL 查询不起作用。

我在这个问题上坐了两天多,希望你能帮助我。

【问题讨论】:

【参考方案1】:

要获得包含教义的存储库,您必须传递一个教义实体的名称。我知道这样做的两种方法(与您的情况有关):

use App\Entity\Section;

$rep = $entityManager->getRepository(Section::class);

$rep = $entityManager->getRepository("App\Entity\Section"); // Path is depending of your application's structure

【讨论】:

我认为它是由 autoload.php 完成的?为什么我不必与制造商合作? 也许你错过了控制器中的使用指令(使用 App\Entity\Section)? 但是为什么我必须手动做呢?我也不和制造商一起做。但它在那里工作。我现在不能尝试,但我猜应该不是问题:s 如果控制器顶部已经有制造商的使用指令(使用 App\Entity\Manufacturer;),那么你可以只写 $entityManager->getRepository("Manufacturer"); .否则你必须写 $entityManager->getRepository("App\Entity\Manufacturer"); 我没有任何实体的使用指令。我只有这个: $config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode);在 $paths 中,有我的实体 php 文件。因此,如果我执行“ $entityManager->getRepository("Manufacturer") 它正在工作,但不适用于 $entityManager->getRepository("Section")...

以上是关于如何在 Doctrine 中建立多对一关系?的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter - 教义插入错误 - 多对一关系

Doctrine2 多对一关联不会使用 JOIN 查询

JPA - 如何在多对一关系中检查条件

Node.js - Mongoose - 在这种情况下,我应该如何分配多个多对一关系?

如何使用hibernate逆向工程排除多对一关系?

如何正确映射与@IdClass 的多对一关系?