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

时间:2016-03-21 13:09:40

标签: php mysql symfony doctrine-orm sylius

挑战:

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

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

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

对于有兴趣的人,我解释下面的原因。

第三方库的基本实体:

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

我的班级:

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

上面的模型代表了最终方法:我的用户实体扩展了syslius&#39;用户实体,应该持久保存并从表中查询&#34; user&#34; (而不是&#34; user&#34; AND&#34; sylius_user&#34;),它包含最终扩展实体的所有列:

表格结构:

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

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

前3列是基本实体中的属性,最后3列是&#34; my&#34;中的属性。用户实体,它通过继承来获得前三个。

我做了什么:

我的用户类看起来像这样:

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 
{

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;
        }
    }
}

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

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

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

每个人都可以看到,另外一个表别名&#34; s0&#34;这里使用的是没有用表格引用它。我想要教条做的是:

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

何实现这个目标?

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

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

因此,我们希望通过添加我们自己的属性来扩展sylius的用户类,以构建一个&#34; bridge&#34;在sylius类和我们的用户类之间。两者之间的差异在属性方面很小,只有几列可以重命名并添加一些特殊的属性和方法。但是我们从用户类到其他实体之间有很多关系,如果我们可以学习忽略表继承人员并且只是在这里作为一个普通的类重用事物,那么这不会成为一个问题。 / p>

1 个答案:

答案 0 :(得分:1)

基类是MappedSuperclass吗?

只要基类定义为MappedSuperclass,您只需扩展类并将扩展类定义为Entity

Sylius默认将实体定义为MappedSuperclass。订阅者(https://developer.mozilla.org/en/docs/Web/CSS/vertical-align)传递每个实体并在必要时将MappedSuperclass设置为false,这意味着当在配置中定义类时,它将MappedSuperclass更改为Entity。