0

ページに関する基本的な編集可能な情報を持つエンティティSettingsを作成したいと考えています。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 オブジェクトが作成されると思います。何か助けはありますか?

4

1 に答える 1

1

たとえそれがダミーであっても、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);

http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/data-retrieval-and-manipulation.html#using-prepared-statements

于 2013-10-07T14:09:45.313 に答える