这是我第一次使用OO PHP,MVC和Doctrine,所以我可能做错了! 我正在尝试使用Doctrine将对象保存到数据库中,问题是该对象是完全无效的
这是PHP返回我的错误:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'NM_TIPO_SUPLEMENTO' cannot be null' in C:\Users\Alexandre\apache\workspace\projetoPeso\vendor\doctrine\dbal\lib\Doctrine\DBAL\Statement.php:138 Stack trace: #0 C:\Users\Alexandre\apache\workspace\projetoPeso\vendor\doctrine\dbal\lib\Doctrine\DBAL\Statement.php(138): PDOStatement->execute(NULL) #1 C:\Users\Alexandre\apache\workspace\projetoPeso\vendor\doctrine\orm\lib\Doctrine\ORM\Persisters\BasicEntityPersister.php(278): Doctrine\DBAL\Statement->execute() #2 C:\Users\Alexandre\apache\workspace\projetoPeso\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php(929): Doctrine\ORM\Persisters\BasicEntityPersister->executeInserts() #3 C:\Users\Alexandre\apache\workspace\projetoPeso\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php(318): Doctrine\ORM\UnitOfWork->executeInserts(Object(Doctrine\ORM\Mapping\ClassMetadata)) #4 C:\Users\Alexandre\apache\workspace\projetoPeso\vendor\doctrine\orm\lib\Doctrine\ORM\E in C:\Users\Alexandre\apache\workspace\projetoPeso\vendor\doctrine\dbal\lib\Doctrine\DBAL\DBALException.php on line 47
我知道我正确地进行了映射,因为如果我在模型上更改列的名称,则表示我的列不存在
这是我的模特:
<?php
/**
* @Entity @Table(name="tb_tipo_suplemento")
**/
class TipoSuplemento {
/** @Id @Column(type="integer", name="ID_TIPO_SUPLEMENTO") @GeneratedValue(strategy="IDENTITY") **/
protected $idTipo;
/** @Column(type="string", name="NM_TIPO_SUPLEMENTO", nullable=false) **/
protected $nmTipo;
public function setIdTipo($idTipo) {
$this->idTipo = $idTipo;
}
public function getIdTipo() {
return $this->idTipo;
}
public function setNmTipo($NmTipo) {
$this->NmTipo = $NmTipo;
}
public function getNmTipo() {
return $this->NmTipo;
}
}
?>
我的控制员:
<?php
class ctrlTipoSuplemento {
public function salvarTipoSuplemento() {
require("../model/TipoSuplemento.php");
require_once "../bootstrap.php";
//criar um objeto novo e o preencher
$tpSuplemento = new TipoSuplemento();
$tpSuplemento->setNmTipo($_POST['nmTipoSuplemento']);
$entityManager->persist($tpSuplemento);
$entityManager->flush();
}
}
?>
my view.php
<?php
require("../util/header.php");
require("../util/footer.php");
require("../controller/ctrlTipoSuplemento.php");
getHeader("Manter Tipo de Suplemento", "Tipo de Suplemento");
montarFormulario();
?>
<form action="" method="post">
<input type="text" name="nmTipoSuplemento" required="required" placeholder="Tipo do Suplemento"><br>
<button type="submit">Salvar</button>
</form>
<?php
/*
* Salvar os dados do formulário acima
*/
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$ctrl = new ctrlTipoSuplemento();
$ctrl->salvarTipoSuplemento();
}
terminarFomulario();
?>
<?php getFooter();?>
和bootstrap.php
<?php
// bootstrap.php
use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;
require_once "vendor/autoload.php";
$isDevMode = true;
$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/model"), $isDevMode);
// database configuration parameters
$conn = array(
'driver' => 'pdo_mysql',
'user' => 'root',
'password' => '',
'dbname' => 'suplementos',
);
$entityManager = EntityManager::create($conn, $config);
我的桌子:
CREATE TABLE IF NOT EXISTS `tb_tipo_suplemento` (
`ID_TIPO_SUPLEMENTO` int(10) NOT NULL AUTO_INCREMENT,
`NM_TIPO_SUPLEMENTO` varchar(100) NOT NULL,
PRIMARY KEY (`ID_TIPO_SUPLEMENTO`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
非常感谢你!
编辑1:添加了view.php
编辑2: getter和setter有什么问题吗?如果我将private
替换为public
,并将变量值设置为此$tpSuplemento->nmTipo = $_POST['nmTipoSuplemento'];
则可以正常工作
答案 0 :(得分:0)
我看到的一个问题是您的列NM_TIPO_SUPLEMENTO
不允许空值。您是否希望列不允许空值?
这里有nullable=false
:
/** @Column(type="string", name="NM_TIPO_SUPLEMENTO", nullable=false) **/
protected $nmTipo;
如果您不想允许空值,请确保您没有为$ nmTipo传入null值。
如果您确实要允许空值,请将nullable=false
更改为nullable=true
。此外,您需要将NM_TIPO_SUPLEMENTO的数据库表设置为允许nulls
。
将getter / setter方法设置为public
的原因是因为您无法在外部使用private
方法。私有方法只能由您的类在内部使用。我不确定为什么你这样做没有语法错误。
另一个问题出在你的getter / setter中。你打错了。它应该是这样的:
public function setNmTipo($NmTipo) {
$this->nmTipo = $NmTipo;
}
public function getNmTipo() {
return $this->nmTipo;
}
请注意小写$this->nmTipo
。这与$this->NmTipo