如何从没有判别者列的Doctrine-Entity扩展

iti*_*nce 8 php mysql symfony doctrine-orm sylius

挑战:

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

在这里要清楚:我对经典表继承感兴趣.我只想以这种方式扩展一个带有附加列的基类,数据库中的表表示所有需要列的总和.

无需创建基本实体的实例.

对于那些感兴趣的人,我解释下面的原因.

第三方库的基础实体:

Sylius\UserEntity (TableName: "sylius_user")
============================================
ColA, ColB, ColC
Run Code Online (Sandbox Code Playgroud)

我的课:

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

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

表结构:

因此,我的szenario中只存在一个表.

Table "user":
=============
ColA, ColB, ColC, ColD, ColE, ColF
Run Code Online (Sandbox Code Playgroud)

前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 
{
Run Code Online (Sandbox Code Playgroud)

UserRepository:

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此查询导致从表"user"中选择列,但查询尝试使用单独的表别名选择两列.生成的查询失败,因为它已损坏.

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

SELECT s0.ColA, s0.ColB, s0.ColC, 
u0.ColD, u0.ColE, u0.ColF
FROM user u0
Run Code Online (Sandbox Code Playgroud)

每个人都可以看到,这里使用了一个额外的表别名"s0",而没有用表格引用它.我想要教条做的是:

SELECT u0.ColA, u0.ColB, u0.ColC, 
u0.ColD, u0.ColE, u0.ColF
FROM user u0
Run Code Online (Sandbox Code Playgroud)

何实现这个?

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

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

因此,我们希望通过添加自己的属性来扩展sylius的用户类,以在sylius类和我们的用户类之间构建"桥梁".两者之间的差异在属性方面很小,只有几列可以重命名并添加一些特殊的属性和方法.但是我们从用户类到其他实体之间有很多关系,如果我们可以理论上忽略表继承人员并且只是在这里充当普通的类重用事件,这就不会成为问题.

r.v*_*ven 1

基类是 a 吗MappedSuperclass

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

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