使用这些类,您将如何将“Person”的记录更改为“Employee”。
/**
* @Entity
* @InheritanceType("SINGLE_TABLE")
* @DiscriminatorColumn(name="discr", type="string")
* @DiscriminatorMap({"person" = "Person", "employee" = "Employee"})
*/
class Person
{
// ...
}
/**
* @Entity
*/
class Employee extends Person
{
// ...
}
我尝试更改鉴别器列的值,但我无法访问它。我还尝试创建一个“员工”实例并手动复制数据,但这不适用于自动递增的 ID。它只是作为新记录添加,而不是更新现有记录。
我是否需要编写自定义 sql 查询,或者我是否在做其他根本错误的事情?
最佳答案
当对象实例的类型需要随时间改变时,这不是一个好兆头。我在这里不是在谈论向下转换/向上转换,而是关于更改对象的真实类型的需要。
首先,让我告诉你为什么这是个坏主意:
这就是为什么大多数语言不允许您在执行期间更改对象的真实类类型的部分原因(当然还有内存,但我不想详细说明)。有些让你这样做(有时以扭曲的方式,例如 JVM),但这确实不是好的做法!
这样做的必要性往往在于糟糕的面向对象设计决策。
出于这些原因,Doctrine 不允许您更改实体对象的类型。当然,您可以编写纯 SQL(在本文末尾 - 但请通读!)来进行更改,但我建议使用以下两个“干净”选项:
我知道你已经说过第一个选项不是一个选项,但我花了一些时间写下这篇文章,所以我觉得我应该尽可能完整地写这篇文章以供将来引用。
Person 更改为Employee 时,创建一个新的Employee 实例并从旧实例复制您要复制的数据Person 对象到 Employee 对象。不要忘记删除旧实体并保留新实体。现在,这是我之前谈到的纯 SQL 方法 - 希望您不需要使用它!
确保您的查询经过清理(因为查询将在没有任何验证的情况下执行)。
$query = "UPDATE TABLE_NAME_HERE SET discr = 'employee' WHERE id = ".$entity->getId();
$entity_manager->getConnection()->exec( $query );
这是 DBAL\Connection 类中的 exec 方法的文档和代码(供您引用):
/**
* Execute an SQL statement and return the number of affected rows.
*
* @param string $statement
* @return integer The number of affected rows.
*/
public function exec($statement)
{
$this->connect();
return $this->_conn->exec($statement);
}
关于php - 学说 : Update discriminator for SINGLE_TABLE Inheritance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12610421/
我们正在构建一个使用Oracle数据库的Symfony2应用程序。数据库中的所有数据编码为WE8ISO8859P15(iso-8859-1),所有网站编码为utf-8。有没有办法把从数据库接收到的数据全部转成utf8,把发到DB的数据全部转成iso-8859-1,而不是把网站转成iso8859-1?也许使用Doctrine事件订阅者?如果是这样,我应该拦截哪些事件? 最佳答案 我用MSSQL实例解决了一个类似的问题,用于从utf8转换为latin1,反之亦然。我执行以下步骤:定义自定义DBAL类型在启动Bundle方法上初始化(我想
我想在页面的页脚添加一些统计信息,如“184ms/6/10ms”。其中184毫秒是页面生成时间,6是查询计数,10是数据库查询所花费的时间。我可以计算出页面生成时间,但我如何从原则中获取数据库统计信息?这当然是在应用程序环境中运行时,我很欣赏在app_dev中,当symfony分析器正在运行时,可能有一种方法可以获取它。如有任何帮助,我们将不胜感激。 最佳答案 您可以使用DebugStack对象来完成此操作。您将拥有一个包含每个查询及其各自执行时间的数组。示例:$doctrine=$this->get('doctrine');$do
当我尝试为实体创建原则crud时,我收到“未知实体namespace别名”异常。我有以下项目结构使用src\Project\Entity目录中的实体的一系列bundle(在Bundles目录中)。如你所见,我的实体命名空间是namespaceProject\Entity;我觉得这可能与auto_mapping有关,但我已经玩了4-5个小时,但一无所获。有什么建议吗? 最佳答案 解决方法:创建一个扩展基本原则crud命令的命令扩展\Sensio\Bundle\GeneratorBundle\Command\GenerateDoctri
好的,所以我在文件夹层次结构中得到了Doctrine.php文件,如下所示:\includes\Setup.phpDoctrine\Common\DBAL\ORM\Symfony\Doctrine.phpMysetup.phphasthefollowing:$rootPath=$_SERVER['DOCUMENT_ROOT'];$includePath=getcwd()."\includes";ini_set('include_path','.'.PATH_SEPARATOR.$rootPath.PATH_SEPARATOR.$includePath);require_once'inc
在搜索时,我得到了很多有类似问题的人的结果,但它们总是与关联错误有关。我正在尝试将一个简单的文本字段添加到数据库中的表中,但对于我的一生,我无法弄清楚这次有什么不同-我之前已经多次完成它而没有任何问题。我已将“record_checksum”字段添加到4个不同的实体,但我将只使用其中一个,以简化示例。(所有4个都发生相同的错误)。这是我的Entity\Cloud.php文件的示例,在底部添加了“record_checksum”字段:useDoctrine\ORM\MappingasORM;namespaceEntity;/***Entity\Cloud**@orm:Table(name
我正在研究symfony2框架。在我的示例应用程序中,我有Blog实体和BlogEntry实体。它们以一对多的关系连接。这是BlogEntry类:classBlogEntry{....private$blog;....publicfunctiongetBlog(){return$this->blog;}publicfunctionsetBlog(Blog$blog){$this->blog=$blog;}}我想将方法setBlogByBlogId添加到BlogEntry类,我是这样看的:publicfunctionsetBlogByBlogId($blogId){if($blogI
我正在尝试执行包含类似内容的学说SUM(a.id=1)as`1`由于某些原因,它总是给我以下错误:[SyntaxError]line0,col15:Error:ExpectedDoctrine\ORM\Query\Lexer::T_CLOSE_PARENTHESIS,got'='这是我正在使用的代码$result=$em->getRepository('MyBundle:PlayerAction')->createQueryBuilder('pa')->select(array('SUM(a.id=1)as`1`,SUM(a.id=2)as`2`,SUM(a.id=3)as`3`,p.
我的模型/实体类中有一个变量$pk。我想将它映射到我的表中的table_pk字段。我该怎么做?我正在阅读本手册=>http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html#annref-column.但似乎没有什么能做我想做的。非常感谢一个关于如何使用注释和yaml映射完成此操作的示例。 最佳答案 这非常简单(仅当您的PK是自动增量时才需要@ORM\GeneratedValue位):nam
背景我正在做一个作品集网站,该网站相当简单,大部分作品都在画廊上。我有一组数据库表,所有表都链接起来以不同的方式检索和过滤画廊,从顶部开始,如下所示:GalleryCategory->Gallery->GalleryImage问题我面临的问题仅出现在画廊类别页面上,我在其中查看给定类别中的所有画廊,然后返回画廊中的画廊图像。我的Controller目前看起来像这样:publicfunctiongalleryCategoryAction($categoryId){$em=$this->getDoctrine()->getManager();$category=$em->getReposi
我在Symfony和Doctrine问题上遇到了一个奇怪的行为,实际上发现这可能与this有关漏洞。request.CRITICAL:UncaughtPHPExceptionDoctrine\ORM\EntityNotFoundException:"Entitywasnotfound."at/dev/vendor/doctrine/orm/lib/Doctrine/ORM/Proxy/ProxyFactory.phpline177{"exception":"[object](Doctrine\ORM\EntityNotFoundException(code:0)提供一些代码示例:$ne