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