MySQL 保存到数据库 Symfony2 时出错
MySQL Error on Persisting to Database Symfony2
问题:
我在使用原则将实体保存到数据库时收到以下 MySQL 错误,none 我的实体名称是保留字。我已经尝试了很多事情,包括重建数据库和表以及 运行 doctrine:schema:update 但无济于事。任何帮助将不胜感激。
错误:
string(601) "An exception occurred while executing 'INSERT INTO
release (serial, title, artist, length, genre, description, tracks,
download, thumbnail, artwork) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'
with params ["FREELOV", "afds", "asdf", "2:23", "asdf", "asdf",
"fdsaf=>2:23", "FREELOV.zip", "FREELOV.jpg", "FREELOVThumb.jpg"]:
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an
error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near 'release
(serial, title, artist, length, genre, description, tracks, download,
th' at line 1"
实体:
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Class Release
* @ORM\Entity
* @ORM\Table(name="release")
*/
class Release
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length=255)
*/
protected $serial;
/**
* @ORM\Column(type="string", length=255)
*/
protected $title;
/**
* @ORM\Column(type="string", length=255)
*/
protected $artist;
/**
* @ORM\Column(type="string", length=255)
*/
protected $length;
/**
* @ORM\Column(type="string", length=255)
*/
protected $genre; # Array
/**
* @ORM\Column(type="string", length=255)
*/
protected $description;
/**
* @ORM\Column(type="string", length=255)
*/
protected $tracks;
/**
* @ORM\Column(type="string", length=255)
*/
protected $download;
/**
* @ORM\Column(type="string", length=255)
*/
protected $thumbnail;
/**
* @ORM\Column(type="string", length=255)
*/
protected $artwork;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
// Doctrine generated getters & setters
释放控制器:
//namespaces and use statments
class ReleaseController extends Controller{
public function indexAction(Request $request)
{
$release = new Release();
$form = $this->createFormBuilder($release)
->add('Artist', 'text')
->add('Title', 'text')
->add('Genre', 'text')
->add('Description', 'textarea')
->add('Tracks', 'text', array('attr' => array('style' => 'display:none')))
->add('Length', 'text', array('label' => ' ', 'attr' => array('style' => 'display:none')))
->add('addTrack', 'button', array('label'=>'+'))
->add('Download', 'file')
->add('Thumbnail', 'file')
->add('Artwork', 'file')
->add('save', 'submit', array('label' => 'Add Release'))
->getForm();
$form->handleRequest($request);
if($form->isValid()){
$rel = $this->createAction($form);
dump($rel);
$this->addToDB($rel);
}
return $this->render('cms/addRel.html.twig', array(
'form' => $form->createView(),
));
}
public function createAction(Form $form)
{
$release = new Release();
$release->setSerial('FREELOV'.$release->getId());
$artist = $form->get('Artist')->getData();
$title = $form->get('Title')->getData();
$genre = $form->get('Genre')->getData();
$description = $form->get('Description')->getData();
$tracks = $form->get('Tracks')->getData();
$length = $form->get('Length')->getData();
$download = $this->uploadAction($form, 'Download', $release);
$thumb = $this->uploadAction($form, 'Artwork', $release);
$art = $this->uploadAction($form, 'Thumbnail', $release);
$release->setArtist($artist);
$release->setTitle($title);
$release->setLength($length);
$release->setGenre($genre);
$release->setDescription($description);
$release->setTracks($tracks);
$release->setDownload($download);
$release->setThumbnail($thumb);
$release->setArtwork($art);
return $release;
}
public function uploadAction($form, $file, Release $rel)
{
$fileString = $rel->getSerial();
#TODO: Needs to include error checking, use preg_match and $form[]->getData to make sure files are the right type
switch($file)
{
case 'Download':
$fileString = $fileString.'.zip';
break;
case 'Thumbnail':
$fileString = $fileString.'Thumb.jpg';
break;
case 'Artwork':
$fileString = $fileString.'.jpg';
break;
}
$dir = 'bin/'; #FIXME: Needs to be directory for file uploads (maybe definable in the parameters.yml?)
$form[''.$file]->getData()->move($dir, $fileString);
return $fileString;
}
public function addToDB(Release $release)
{
try{
$em = $this->getDoctrine()->getManager();
$em->persist($release);
$em->flush();
return new Response('New release added: '.$release->getArtist().' - '.$release->getTitle());
}catch(\Exception $e){
var_dump($e->getMessage());
}
}
}
RELEASE
是 MySQL 中的 reserved word。
如果你真的想让你的 table 被命名为 release
,你必须在实体中设置 table 名称并引用它,如下所示:
<?php
/**
* @ORM\Enity
* @ORM\Table(name="`release`")
*/
class Release;
…
但是,如果您仍然可以选择不同的名称,我建议您这样做。这可以让你以后免去很多麻烦。
问题:
我在使用原则将实体保存到数据库时收到以下 MySQL 错误,none 我的实体名称是保留字。我已经尝试了很多事情,包括重建数据库和表以及 运行 doctrine:schema:update 但无济于事。任何帮助将不胜感激。
错误:
string(601) "An exception occurred while executing 'INSERT INTO release (serial, title, artist, length, genre, description, tracks, download, thumbnail, artwork) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with params ["FREELOV", "afds", "asdf", "2:23", "asdf", "asdf", "fdsaf=>2:23", "FREELOV.zip", "FREELOV.jpg", "FREELOVThumb.jpg"]: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'release (serial, title, artist, length, genre, description, tracks, download, th' at line 1"
实体:
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Class Release
* @ORM\Entity
* @ORM\Table(name="release")
*/
class Release
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length=255)
*/
protected $serial;
/**
* @ORM\Column(type="string", length=255)
*/
protected $title;
/**
* @ORM\Column(type="string", length=255)
*/
protected $artist;
/**
* @ORM\Column(type="string", length=255)
*/
protected $length;
/**
* @ORM\Column(type="string", length=255)
*/
protected $genre; # Array
/**
* @ORM\Column(type="string", length=255)
*/
protected $description;
/**
* @ORM\Column(type="string", length=255)
*/
protected $tracks;
/**
* @ORM\Column(type="string", length=255)
*/
protected $download;
/**
* @ORM\Column(type="string", length=255)
*/
protected $thumbnail;
/**
* @ORM\Column(type="string", length=255)
*/
protected $artwork;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
// Doctrine generated getters & setters
释放控制器:
//namespaces and use statments
class ReleaseController extends Controller{
public function indexAction(Request $request)
{
$release = new Release();
$form = $this->createFormBuilder($release)
->add('Artist', 'text')
->add('Title', 'text')
->add('Genre', 'text')
->add('Description', 'textarea')
->add('Tracks', 'text', array('attr' => array('style' => 'display:none')))
->add('Length', 'text', array('label' => ' ', 'attr' => array('style' => 'display:none')))
->add('addTrack', 'button', array('label'=>'+'))
->add('Download', 'file')
->add('Thumbnail', 'file')
->add('Artwork', 'file')
->add('save', 'submit', array('label' => 'Add Release'))
->getForm();
$form->handleRequest($request);
if($form->isValid()){
$rel = $this->createAction($form);
dump($rel);
$this->addToDB($rel);
}
return $this->render('cms/addRel.html.twig', array(
'form' => $form->createView(),
));
}
public function createAction(Form $form)
{
$release = new Release();
$release->setSerial('FREELOV'.$release->getId());
$artist = $form->get('Artist')->getData();
$title = $form->get('Title')->getData();
$genre = $form->get('Genre')->getData();
$description = $form->get('Description')->getData();
$tracks = $form->get('Tracks')->getData();
$length = $form->get('Length')->getData();
$download = $this->uploadAction($form, 'Download', $release);
$thumb = $this->uploadAction($form, 'Artwork', $release);
$art = $this->uploadAction($form, 'Thumbnail', $release);
$release->setArtist($artist);
$release->setTitle($title);
$release->setLength($length);
$release->setGenre($genre);
$release->setDescription($description);
$release->setTracks($tracks);
$release->setDownload($download);
$release->setThumbnail($thumb);
$release->setArtwork($art);
return $release;
}
public function uploadAction($form, $file, Release $rel)
{
$fileString = $rel->getSerial();
#TODO: Needs to include error checking, use preg_match and $form[]->getData to make sure files are the right type
switch($file)
{
case 'Download':
$fileString = $fileString.'.zip';
break;
case 'Thumbnail':
$fileString = $fileString.'Thumb.jpg';
break;
case 'Artwork':
$fileString = $fileString.'.jpg';
break;
}
$dir = 'bin/'; #FIXME: Needs to be directory for file uploads (maybe definable in the parameters.yml?)
$form[''.$file]->getData()->move($dir, $fileString);
return $fileString;
}
public function addToDB(Release $release)
{
try{
$em = $this->getDoctrine()->getManager();
$em->persist($release);
$em->flush();
return new Response('New release added: '.$release->getArtist().' - '.$release->getTitle());
}catch(\Exception $e){
var_dump($e->getMessage());
}
}
}
RELEASE
是 MySQL 中的 reserved word。
如果你真的想让你的 table 被命名为 release
,你必须在实体中设置 table 名称并引用它,如下所示:
<?php
/**
* @ORM\Enity
* @ORM\Table(name="`release`")
*/
class Release;
…
但是,如果您仍然可以选择不同的名称,我建议您这样做。这可以让你以后免去很多麻烦。