Php 如何从条令实体扩展到无鉴别器列 挑战:

Php 如何从条令实体扩展到无鉴别器列 挑战:,php,mysql,symfony,doctrine-orm,sylius,Php,Mysql,Symfony,Doctrine Orm,Sylius,我想以这种方式重新使用带有类继承的第三方bundle的现有实体,即只剩下一个表,不需要额外的东西。这意味着:没有鉴别器列和联接。 相反,只有最后一个继承最多的类才应该是可查询的,向基本实体添加一些属性,并只使用一个包含所有列的表,这些列通过自身和继承添加到实体中 这里要明确的是:我对经典的表继承不感兴趣。我只想用这种方式扩展一个基类,使其具有额外的列,即数据库中的表表示所有所需列的总和 不需要能够创建基本实体的实例 对于那些感兴趣的人,我将在下面解释原因 第三方库的基本实体: 我的班级: 前3列

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

这里要明确的是:我对经典的表继承不感兴趣。我只想用这种方式扩展一个基类,使其具有额外的列,即数据库中的表表示所有所需列的总和

不需要能够创建基本实体的实例

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

第三方库的基本实体: 我的班级: 前3列是基本实体中的属性,后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”中选择列,但查询会尝试使用单独的表别名选择列两次。结果查询失败,因为它已断开

这里的教义是这样的: 正如大家所看到的,这里使用了一个附加的表别名“s0”,而不使用表来引用它。我想让doctrin做的是:

SELECT u0.ColA, u0.ColB, u0.ColC, 
u0.ColD, u0.ColE, u0.ColF
FROM user u0
如何做到这一点

对于那些对本任务的目的感兴趣的人: 我们希望将sylius捆绑包添加到我们长期存在的symfony应用程序中,该应用程序已经有了自己的用户捆绑包,其中包含用户模型类和现有数据


因此,我们希望通过添加我们自己的属性来扩展sylius的用户类,从而在sylius类和我们的用户类之间建立一座“桥梁”。两者在属性方面的区别很小,只需重命名和添加一些特殊属性和方法的几列。但是,我们的用户类与其他实体之间有很多关系,如果我们可以忽略表继承人员,只是作为一个简单的类在这里重复使用,这就不会成为问题。

基类a
MappedSuperclass

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


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

我不知道Sylius是如何工作的,所以这只是一个猜测。这有帮助吗:?
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;
        }
    }
}
SELECT s0.ColA, s0.ColB, s0.ColC, 
u0.ColD, u0.ColE, u0.ColF
FROM user u0
SELECT u0.ColA, u0.ColB, u0.ColC, 
u0.ColD, u0.ColE, u0.ColF
FROM user u0