【发布时间】:2017-08-31 06:01:22
【问题描述】:
我正在尝试使用值为 0 或 1 的布尔字段来保留一个学说实体。
当该属性设置为 true 时,它会在数据库中将其保存为 '1'。 但是当它为'false'或'0'时,它会在数据库中将其保存为NULL。
如何解决这个问题,只保存为 1 或 0?
我使用的属性的注释如下:
@ORM\Column(name="substitute", type="boolean", nullable=true)
当我将 nullable 设置为 false 时,我无法持久化它,因为它仍然想设置为 null。
谢谢
当我坚持它时,字段值为0
尝试 1 @ORM\Column(name="substitute", type="boolean", options={"default":"0"}))
错误:无法保存 null
尝试 2 @ORM\Column(name="substitute", type="boolean", nullable= true, options={"default":"0"}))
不起作用,它仍然在 base 中保存 null
信息 1
实际插入查询正在尝试插入 0。但我收到此错误“ORA-01400: cannot insert NULL into (\"MYBASE\".\"MYTABLE\".\"SUBSTITUTE\")”
信息 2
相同的附加到另一个实体
class TestEntity
{
/**
* @ORM\Column(name="test_entity_id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(name="substitute", type="boolean")
*/
private $isSubstitute = false;
}
坚持
$test = new TestEntity();
$test->setIsSubstitute(false);
$em->persist($test);
结果
request.CRITICAL: Uncaught PHP Exception Doctrine\DBAL\Exception\NotNullConstraintViolationException: "An exception occurred while executing 'INSERT INTO TestEntity (test_entity_id, substitute) VALUES (?, ?)' with params [7, 0]: SQLSTATE[HY000]: General error: 1400 OCIStmtExecute: ORA-01400: cannot insert NULL into ("MYBASE"."TESTENTITY"."SUBSTITUTE") (ext\pdo_oci\oci_statement.c:148)"\n (ext\\pdo_oci\\oci_statement.c:148) at PATH\\vendor\\doctrine\\dbal\\lib\\Doctrine\\DBAL\\Driver\\PDOStatement.php:91)"} []
信息 3
使用 oci 或 oci8 驱动程序手动插入
sql> INSERT INTO TestEntity (test_entity_id, substitute) VALUES (13, 0)
[2017-04-06 11:21:15] 1 row affected in 62ms
【问题讨论】:
-
请记住,默认值:0 东西严格用于数据库。 Doctrine 本身不会在您的实体中设置任何默认值。私人 $substitute = false;应该管用。如果没有,那么您还有其他东西可以改变值。
-
调试 $em->persist($affectation) 行时,该字段值正确设置为 'false'。实际插入查询将'false'替换为'0',但我收到错误“无法插入NULL”......
-
听起来像是配置问题或控制器问题。您的 Oracle 连接对其他实体是否正常工作?我想你已经正确设置了 oci8?
-
@AlvinBunk 我正在使用 oci 驱动程序。 (不是 oci8)。我没有与此案有关的其他实体。
-
如果您将 Symfony 与 Oracle 一起使用,您应该使用 oci8。您的 parameters.yml 文件应该有:
database_driver: oci8如果您需要帮助,我创建了一篇关于 installing OCI8 on RHEL 的文章。基本上根据 Oracle 和 Underground PHP and Oracle Manual,你应该使用 oci8 和 PHP。
标签: php symfony doctrine-orm doctrine