【问题标题】:Saving entity form error - symfony2 [closed]保存实体表单错误 - symfony2 [关闭]
【发布时间】:2014-01-05 10:14:39
【问题描述】:

当我尝试保存简单表单时出现错误

错误 使用参数 [“sdfsdf”、“sd”、“2014-01-05 11:11:31”、“2014-01-05 11:11:31”、“2014-01-05 00:00:00”、“ 2014-01-05 00:00:00”、“435”、“dfgfg”、空]:

SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“desc、dateTimeStart、dateTimeEnd、visibleFrom、visibleTo、timetype、locationName”附近使用正确的语法 500 内部服务器错误 - DBALException 1 个关联异常:

实体:

/**
 * CalendarEvent
 * @ORM\Entity
 * @ORM\Table(name="mEvents", indexes={
@ORM\Index(name="id", columns={"id"})
,@ORM\Index(name="time", columns={"dateTimeStart","dateTimeEnd"})
})
 */
class Event {

    /**
     * @var integer
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var string
     * @ORM\Column(type="string", nullable=true)
     */
    protected $title;

    /**
     * @var string
     * @ORM\Column(type="string", nullable=true)
     */
    protected $desc;

    /**
     * event start time
     * @var int
     * @ORM\Column(type="datetime")
     */
    protected $dateTimeStart;

    /**
     * event end time
     * @var int
     * @ORM\Column(type="datetime")
     */
    protected $dateTimeEnd;

    /**
     * @var int
     * @ORM\Column(type="datetime")
     */
    protected $visibleFrom;


    /**
     * @var int
     * @ORM\Column(type="datetime")
     */
    protected $visibleTo;


    /**
     * 1 jednodniowe, 2wielodniowe, 3 cykliczne, 4 zakresowe
     * @var int
     * @ORM\Column(type="smallint", length=2, nullable=true)
     */
    protected $timetype;

    /**
     * Nazwa miejsca
     * @var string
     * @ORM\Column(type="string", nullable=true)
     */
    protected $locationName;

    /**
     * miejsce
     * @ORM\Column(type="integer", nullable=true)
     * @ORM\ManyToOne(targetEntity="Miejsce",inversedBy="events")
     * @ORM\JoinColumn(referencedColumnName="id")
     */
    protected $miejsce;

表格:

 /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {


        $builder
            ->add('title', 'text')
            ->add('desc', 'text')
            ->add('dateTimeStart', 'datetime',array(
                'format' => \IntlDateFormatter::SHORT,
                'input' => 'datetime',
                'widget' => 'single_text',
                'data' => new \DateTime("now")))
            ->add('dateTimeEnd', 'datetime',array(
                'format' => \IntlDateFormatter::SHORT,
                'input' => 'datetime',
                'widget' => 'single_text',
                'data' => new \DateTime("now")))
            ->add('visibleFrom', 'date',array(
                'input' => 'datetime',
                'data' => new \DateTime("now")))
            ->add('visibleTo', 'date',array(
            'input' => 'datetime',
            'data' => new \DateTime("now")))
            ->add('timetype', 'text')
            ->add('locationName', 'text')
            //->add('textadres', 'places_autocomplete')

            //->add('mkeywordsId', 'text')

            ->add('save', 'submit')
        ;
    }

控制器编辑动作

/**
 * @Template
 * @param string $id
 * @return Response
 */
public function EditAddAction($id='')
{




    /**
     * @var $hotel Mmiejsce
     */
    if($id)
        $entity = $this->getDoctrine()
            ->getRepository('MiejsceCalendarBundle:Event')
            ->find($id);
    else
        $entity = new Event();



    $form = $this->createForm(new EventType(), $entity);

    $request = $this->getRequest();

    $form->handleRequest($request);

    if ($form->isValid()) {

        $em = $this->getDoctrine()->getManager();
        $em->persist($entity);
        $em->flush();

    }

    return ['form'=>$form->createView()];

}

【问题讨论】:

    标签: php forms symfony


    【解决方案1】:

    desc 是 MySQL 中的保留关键字。然后你应该重命名这个属性。

    编辑,

    即使 Doctrine 允许您通过转义关键字来使用关键字。我建议您重命名您的资源(最佳做法)以避免任何混淆。

    【讨论】:

    • 学说不应该自动执行此操作吗? 编辑:重新研究了一下,发现了我在回答中所说的内容。
    • 我认为最好正确地重命名它以避免任何混淆,但原则允许您使用关键字(通过转义它们)。
    • @MarkusKottländer 好的,我刚刚看了你的回答。为“最佳实践”建议 +1。
    • 出于同样的原因 +1 ;)
    【解决方案2】:

    如果您想使用保留关键字 (desc) 作为列名,您应该对其进行转义:

    /**
     * @var string
     * @ORM\Column(name="`desc`", type="string", nullable=true)
     */
    protected $desc;
    

    但最佳做法是不使用保留关键字。

    【讨论】:

    • 是的。但是,真的:不要。你很容易给自己带来某种痛苦,更进一步。重命名列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    相关资源
    最近更新 更多