Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.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 使用Doctrine向后遍历OneToOne表实体的优雅方式_Php_Doctrine Orm - Fatal编程技术网

Php 使用Doctrine向后遍历OneToOne表实体的优雅方式

Php 使用Doctrine向后遍历OneToOne表实体的优雅方式,php,doctrine-orm,Php,Doctrine Orm,我有一个结构非常简单的实体,它包含一个简单的关联 数据库\实体\租户 id (primary key) parentId (id of the parent entry) code (a simple identifier for the tenant, unique) 我在实体中相应地定义了parentId: /** * @Column(type="integer") * @OneToOne(targetEntity="Tenant") * @Joi

我有一个结构非常简单的实体,它包含一个简单的关联

数据库\实体\租户

id         (primary key)
parentId   (id of the parent entry)
code       (a simple identifier for the tenant, unique)
我在实体中相应地定义了parentId:

/**  
 * @Column(type="integer")
 * @OneToOne(targetEntity="Tenant")
 * @JoinColumn(name="parentTenantId", referencedColumnName="id")
 * **/
 protected $parentId;
这很好——生成的数据库模式类似于我的选择,而且很好

现在我正在编写我的第一个方法,它基本上必须返回一个由所有被链接在一起的租户组成的数组,顺序与此相反(我使用这个方法向后遍历租户链)

为了做到这一点,我想出了使用while()循环的主意

任何没有父级的租户(如基本租户)都没有父级id(或null),因此将结束while循环

$currentTenant = {DATABASE_ENTITY_TENANT}; // In my real code i fetch the entity object of the current tenant

$chain[] = $currentTenant; 

$repository = Database::entityManager()->getRepository('Database_Entity_Tenant');

while(!$currentTenant->getParentId()){
    $currentTenant = $repository->findOneBy(array(
        'id' => $currentTenant->getParentId()
    ));
    $chain[] = $currentTenant;
}
现在所有这些都可能奏效,但对我来说似乎真的很艰难。我是一个相当新的信条,所以我不太了解它,但我相信有一些方法可以更优雅地做到这一点

问题

条令2是否为我提供了一套可以更好地解决上述问题的功能


如果没有,那么还有其他更优雅的方法吗?

如果我没有弄错您的问题,您只需要找到关联表中按父ID排序的所有条目。在Doctrine2中,您可以执行以下操作:

$currentTenant = {DATABASE_ENTITY_TENANT}; // assuming a valid entity

$repository = Database::entityManager()
    ->getRepository('Database_Entity_Tenant')
    ->createQueryBuilder('t')
    ->where('t.parentId IS NOT NULL')
    ->andWhere('t.parentId < :current') /* < or > */
    ->setParameter('current', $currentTenant->getParentId()->getId())
    ->orderBy('t.parentId', 'ASC') /* ASC or DESC, no array_reverse */
    ->getQuery()
    ->getResult();

/* At this point $repository contains all what you need because of Doctrine,
 * but if you want a chain variable: */

$chain = array();
foreach ($repository as $tenant) {
    $chain[] = $tenant->getCode(); // your tenant entity if your entity is mapped correctly
}
$currentTenant={DATABASE\u ENTITY\u TENANT};//假设一个有效实体
$repository=数据库::entityManager()
->getRepository('数据库\实体\租户')
->createQueryBuilder('t')
->其中('t.parentId不为NULL')
->andWhere('t.parentId<:current')/*<或>*/
->setParameter('current',$currentTenant->getParentId()->getId())
->orderBy('t.parentId','ASC')/*ASC或DESC,无数组*/
->getQuery()
->getResult();
/*此时,$repository包含了您所需要的所有内容,
*但如果您想要一个链变量:*/
$chain=array();
foreach($repository as$tenant){
$chain[]=$tenant->getCode();//如果实体映射正确,则为您的租户实体
}

希望这有帮助

看起来很好。非常感谢。我将尝试实施它,并看看它是如何进行的。但是,我想知道:是否没有准备好的功能,以便实现类似{Database_Entity_Tenant}->getParent()的东西?这不是更面向对象的方法吗?在实现它时,我看不出这段代码处理关系的地方。它是这样的:当我调用它时,我使用当前设置的租户作为起点。然后我从那里向后走。因此,我认为上面的代码不能真正解决我的问题。如果
数据库\u实体\u租户
租户
实体映射正确,我的代码就可以工作。我的意思是:
code
应该是
Tenan
实体主键的外键,1:1关系。但正如我告诉你的,我不知道我是否弄错了。。。试试看,让我知道。谢谢。映射应该是正确的。我试过了,但必须添加更多的测试数据,看看它是否正确执行。在此期间,我扩展了我的代码-我现在使用的是一个自定义存储库,我将在这里放置检索父链的方法。对不起,它不能按预期工作。问题是在这段代码中没有一个起点(我不知道在哪里以及如何实现它)。假设ID:5有一个父ID:4,ID:4有一个父ID:3-我的意图是从一个特定点(例如从ID:4)开始获取链。