我要创建实体设置,其中将包含有关页面的基本可编辑信息。我已经Settings.php使用以下来源创建了我的实体:
<?php
namespace Acme\SettingsBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity()
* @ORM\Table(name="settings")
*/
class Settings
{
/**
* @ORM\Column(type="string", length=100)
*/
protected $page_name;
/**
* @ORM\Column(type="string", length=100)
*/
protected $page_description;
/**
* @ORM\Column(type="string", length=100)
*/
protected $page_email;
}
而且我不知道如何在控制器中知道将仅覆盖现有数据,而不创建新数据。这是我的控制器AdminController.php
public function indexAction(Request $request)
{
if (false === $this->get('security.context')->isGranted('ROLE_ADMIN')) {
throw new AccessDeniedException();
}
$settings = new Settings();
$form = $this->createForm('settings', $settings);
$form->handleRequest($request);
if($form->isValid())
{
$em = $this->getDoctrine()->getManager();
$em->persist($settings);
try {
$em->flush();
} catch (\PDOException $e) {
// sth
}
$this->get('session')->getFlashBag()->add(
'success',
'Settings was successfuly changed'
);
}
return $this->render('AcmeSettingsBundle:Admin:index.html.twig', array('form' => $form));
}
我没有对其进行测试,但是我相信它会使用新数据创建一个新的Settings对象。有什么帮助吗?
您应该始终将某个字段设置为ID,即使该字段是虚拟字段也是如此。
分配一些您将始终使用的默认值,这样您就可以毫无问题地更新设置。
通常,DBMS会警告您缺少唯一标识符,因此适用于Doctrine。
$settings = new Settings();
$settings->setId(Settings::DUMMY_IDENTIFIER); // const within class
# rest of the logic
# ....
$em = $this->getDoctrine()->getManager();
$em->persist($settings);
try {
$em->flush();
} catch (\PDOException $e) {
}
您可以采用另一种方法:将每个属性都保留为一行。但是,您将需要构建更复杂的表单类型并执行更多查询。
编辑:
您可以使用原始SQL,但是灵活性较差:
# raw query
$sql = "UPDATE settings SET page_name = ?, page_description = ?, page_email = ?";
# data
$params = array( $settings->getPageName(), $settings->getPageDesc(), $settings->getPageEmail());
# must specify type due to protection against sql injection
$types = array(\PDO::PARAM_STR,\PDO::PARAM_STR,\PDO::PARAM_STR);
# execute it
$stmt = $this->getEntityManager()->getConnection()->executeUpdate($sql, $params, $types);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句