gpt4 book ai didi

php - 如何在没有鉴别器列的情况下从 Doctrine-Entity 进行扩展

转载 作者:可可西里 更新时间:2023-11-01 06:34:00 26 4
gpt4 key购买 nike

挑战:

我想以这种方式重用具有类继承的第三方 bundle 的现有实体,仍然只剩下一个表,不需要额外的东西。这意味着:没有鉴别器列,也没有 JOIN。相反,只有最后最继承的类应该是可查询的,将一些属性添加到基本实体并只使用一个包含所有列的表,这些列从自身和通过继承添加到实体。

在此明确:我对经典表继承感兴趣。我只想用这种方式扩展一个带有附加列的基类,数据库中的表代表所有需要的列的总和。

无需能够创建基础实体的实例。

有兴趣的 friend ,我在下面解释原因。

第三方库基础实体:

Sylius\UserEntity (TableName: "sylius_user")
============================================
ColA, ColB, ColC

我的类(class):

MyProject\UserEntity : Sylius\UserEntity (TableName: "user") <---- overwrite the base table name
========================================
ColD, ColE, ColF

上面的模型代表了最终的方法:我的用户实体扩展了 syslius 的用户实体,并且应该保存在表“user”(而不是“user”和“sylius_user”)中并从中查询,该表包含所有列最终的扩展实体:

表结构:

因此,我的场景中只存在一张表。

Table "user":
=============
ColA, ColB, ColC, ColD, ColE, ColF

前 3 列是基本实体中的属性,最后 3 列是“我的”用户实体中的属性,它通过继承获得了前三列。

我做了什么:

我的用户类如下所示:

use \Sylius\Component\User\Model\User as BaseUser;

/**
* User
*
* @ORM\Entity(repositoryClass="MyAppName\UserBundle\Repository\UserRepository")
* @ORM\Table(name="user", uniqueConstraints= ... */
class User extends BaseUser
{

用户存储库:

class UserRepository extends EntityRepository
{
/**
* @param string $usernameOrEmail
* @return User
*/
public function findByUsernameOrEmail($usernameOrEmail)
{
$qb = $this
->createQueryBuilder('u')
->where('u.username = :search OR u.email = :search')
->setParameter('search', $usernameOrEmail);

try {
return $qb->getQuery()->getSingleResult();
}
catch(NoResultException $e) {
return null;
}
}
}

此查询的结果是从表“user”中选择列,但查询尝试选择列两次,每次都使用单独的表别名。结果查询失败,因为它已损坏。

Doctrine 在这里做什么,看起来像这样:

SELECT s0.ColA, s0.ColB, s0.ColC, 
u0.ColD, u0.ColE, u0.ColF
FROM user u0

如大家所见,这里使用了一个额外的表别名“s0”,而没有用表来引用它。我想要教义做的是:

SELECT u0.ColA, u0.ColB, u0.ColC, 
u0.ColD, u0.ColE, u0.ColF
FROM user u0

如何实现这一点?

对于那些对这个任务的目的感兴趣的人:

我们想将 sylius 包添加到我们长期存在的 symfony 应用程序中,该应用程序已经有一个自己的用户包,其中包含用户模型类和现有数据。

所以我们想通过添加我们自己的属性来扩展 sylius 的用户类,以在 sylius 类和我们的用户类之间建立一个“桥梁”。两者之间的区别在属性方面很小,仅在于几列重命名和添加一些特殊属性和方法。但是我们有很多从我们的用户类到其他实体的关系,如果我们可以学说忽略表继承人员并在这里充当一个普通的类重用对象,这就不是问题了。

最佳答案

基类是MappedSuperclass吗?

只要将基类定义为MappedSuperclass,就可以简单地扩展该类并将扩展类定义为Entity

Sylius 默认将实体定义为 MappedSuperclass。订阅者 ( LoadOrmMetadataSubscriber ) 传递每个实体并在必要时将 MappedSuperclass 设置为 false,这意味着当类在配置中定义时它将 MappedSuperclass 更改为实体。

关于php - 如何在没有鉴别器列的情况下从 Doctrine-Entity 进行扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36131944/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com