Symfony2 Doctrine 无法识别的字段:
Symfony2 Doctrine Unrecognized field:
我创建了一个实体来存储我通过 api
提取的一些数据
当我尝试使用 findByOne 查看该条目是否已存在时,我收到一条错误消息,指出该字段未被识别。
我做了一个php app/console doctrine:schema:update --force
我可以在我的 mySQL 管理器中看到 table 具有正确的字段名 'StadiumID'
那么为什么当我这样做时教义找不到它 findByOne();
我的实体 Class:
<?php
namespace FantasyPro\DataBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Stadium
*
* @ORM\Table("fp_stadium")
* @ORM\Entity(repositoryClass="FantasyPro\DataBundle\Entity\StadiumRepository")
*/
class Stadium
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var integer
*
* @ORM\Column(name="StadiumID", type="integer", length=2, nullable=false, unique=true)
*/
private $stadiumID;
/**
* @var string
*
* @ORM\Column(name="Name", type="string", length=100, nullable=false)
*/
private $name;
/**
* @var string
*
* @ORM\Column(name="City", type="string", length=50, nullable=false)
*/
private $city;
/**
* @var string
*
* @ORM\Column(name="State", type="string", length=10, nullable=true)
*/
private $state;
/**
* @var string
*
* @ORM\Column(name="Country", type="string", length=2, nullable=false)
*/
private $country;
/**
* @var integer
*
* @ORM\Column(name="Capacity", type="integer", length=32, nullable=true)
*/
private $capacity;
/**
* @var string
*
* @ORM\Column(name="PlayingSurface", type="string", length=50, nullable=true)
*/
private $playingSurface;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set stadiumID
*
* @param integer $stadiumID
* @return Stadium
*/
public function setStadiumID($stadiumID)
{
$this->stadiumID = $stadiumID;
return $this;
}
/**
* Get stadiumID
*
* @return integer
*/
public function getStadiumID()
{
return $this->stadiumID;
}
/**
* Set name
*
* @param string $name
* @return Stadium
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set city
*
* @param string $city
* @return Stadium
*/
public function setCity($city)
{
$this->city = $city;
return $this;
}
/**
* Get city
*
* @return string
*/
public function getCity()
{
return $this->city;
}
/**
* Set state
*
* @param string $state
* @return Stadium
*/
public function setState($state)
{
$this->state = $state;
return $this;
}
/**
* Get state
*
* @return string
*/
public function getState()
{
return $this->state;
}
/**
* Set country
*
* @param string $country
* @return Stadium
*/
public function setCountry($country)
{
$this->country = $country;
return $this;
}
/**
* Get country
*
* @return string
*/
public function getCountry()
{
return $this->country;
}
/**
* Set capacity
*
* @param integer $capacity
* @return Stadium
*/
public function setCapacity($capacity)
{
$this->capacity = $capacity;
return $this;
}
/**
* Get capacity
*
* @return integer
*/
public function getCapacity()
{
return $this->capacity;
}
/**
* Set playingSurface
*
* @param string $playingSurface
* @return Stadium
*/
public function setPlayingSurface($playingSurface)
{
$this->playingSurface = $playingSurface;
return $this;
}
/**
* Get playingSurface
*
* @return string
*/
public function getPlayingSurface()
{
return $this->playingSurface;
}
}
我用来添加数据(如果不存在)和更新它(如果存在)的代码:
<?php
namespace FantasyPro\DataBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use FantasyPro\DataBundle\Entity\Stadium;
class DefaultController extends Controller
{
public function indexAction($name)
{
return $this->render('DataBundle:Default:index.html.twig', array('name' => $name));
}
public function updateStadiumAction(){
//get list of stadiums
$client = $this->container->get('fantasyapi');
$stadiumData = $client->Stadiums();
//var_dump($stadiumData);
//get the entity manager
$em = $this->getDoctrine()->getManager();
$repo = $em->getRepository('DataBundle:Stadium');
$log = $stadiumData;
foreach($stadiumData as $stadium){
// Get the current stadium in the list
$criteria = array("StadiumID" =>$stadium['StadiumID']);
var_dump($criteria);
$storedStadium = $repo->FindOneBy($criteria);
if (!$storedStadium) {
/* throw $this->createNotFoundException(
'No product found for id '.$stadium['StadiumID']
);*/
//no stadium exists with the StadiumID passed
//create a new entry
$entry = new Stadium();
$entry->setStadiumID($stadium['StadiumID']);
$entry->setName($stadium['Name']);
$entry->setCity($stadium['City']);
$entry->setState($stadium['State']);
$entry->setCountry($stadium['Country']);
$entry->setCapacity($stadium['Capacity']);
$entry->setPlayingSurface($stadium['PlayingSurface']);
$em->persist($entry);
$log .= 'Added New Stadium: '.$stadium['StadiumID'].' : '.$stadium['Name'].'<br>';
}else{
$storedStadium->setStadiumID($stadium['StadiumID']);
$storedStadium->setName($stadium['Name']);
$storedStadium->setCity($stadium['City']);
$storedStadium->setState($stadium['State']);
$storedStadium->setCountry($stadium['Country']);
$storedStadium->setCapacity($stadium['Capacity']);
$storedStadium->setPlayingSurface($stadium['PlayingSurface']);
$em->persist($storedStadium);
$log .= 'Updated Stadium: '.$stadium['StadiumID'].' : '.$stadium['Name'].'<br>';
}
}
//$em->flush();
return $this->render('DataBundle:Default:index.html.twig', array('log' => $log));
}
}
属性 名字实际上是:
private $stadiumID;
所以你应该这样做:
$repo->findOneBy(array('stadiumID' => $value));
所以更改此行:
$criteria = array("StadiumID" =>$stadium['StadiumID']);
对此:
$criteria = array("stadiumID" =>$stadium['StadiumID']);
Doctrine 的主要作用是将你的应用层(实体)连接到数据库层(表)。因此,学说试图将来自应用层的请求转换为数据库。即使您在数据库中将字段命名为 "StadiumID"
或 "table_name_snake_case"
,当您调用 findOneBy(array($property => $value))
时,学说也期望 $property
引用 属性 名称,并且它会将其翻译成 SQL 之类的 'SELECT FROM .... where StadiumID = :value'
对于仍有问题的其他人,
确保在调用函数 findOneBy(...)
时输入符号 '=>
' 而不是 ',
'
所以而不是:
findOneBy(["code" , "Code-Example"]);
这样做:
findOneBy(["code" => "Code-Example"]);
此外,请确保指定了学说命名策略:
doctrine:
orm:
naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
这是学说的默认命名策略。这样学说就知道如何将实体 属性 名称映射到列名称。
请注意,命名策略配置可能在不同级别的学说配置中。例如,在另一个 repo 中,它是这样配置的:
doctrine:
orm:
default_entity_manager: shopping
entity_managers:
shopping:
naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
我创建了一个实体来存储我通过 api
提取的一些数据当我尝试使用 findByOne 查看该条目是否已存在时,我收到一条错误消息,指出该字段未被识别。
我做了一个php app/console doctrine:schema:update --force
我可以在我的 mySQL 管理器中看到 table 具有正确的字段名 'StadiumID'
那么为什么当我这样做时教义找不到它 findByOne();
我的实体 Class:
<?php
namespace FantasyPro\DataBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Stadium
*
* @ORM\Table("fp_stadium")
* @ORM\Entity(repositoryClass="FantasyPro\DataBundle\Entity\StadiumRepository")
*/
class Stadium
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var integer
*
* @ORM\Column(name="StadiumID", type="integer", length=2, nullable=false, unique=true)
*/
private $stadiumID;
/**
* @var string
*
* @ORM\Column(name="Name", type="string", length=100, nullable=false)
*/
private $name;
/**
* @var string
*
* @ORM\Column(name="City", type="string", length=50, nullable=false)
*/
private $city;
/**
* @var string
*
* @ORM\Column(name="State", type="string", length=10, nullable=true)
*/
private $state;
/**
* @var string
*
* @ORM\Column(name="Country", type="string", length=2, nullable=false)
*/
private $country;
/**
* @var integer
*
* @ORM\Column(name="Capacity", type="integer", length=32, nullable=true)
*/
private $capacity;
/**
* @var string
*
* @ORM\Column(name="PlayingSurface", type="string", length=50, nullable=true)
*/
private $playingSurface;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set stadiumID
*
* @param integer $stadiumID
* @return Stadium
*/
public function setStadiumID($stadiumID)
{
$this->stadiumID = $stadiumID;
return $this;
}
/**
* Get stadiumID
*
* @return integer
*/
public function getStadiumID()
{
return $this->stadiumID;
}
/**
* Set name
*
* @param string $name
* @return Stadium
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set city
*
* @param string $city
* @return Stadium
*/
public function setCity($city)
{
$this->city = $city;
return $this;
}
/**
* Get city
*
* @return string
*/
public function getCity()
{
return $this->city;
}
/**
* Set state
*
* @param string $state
* @return Stadium
*/
public function setState($state)
{
$this->state = $state;
return $this;
}
/**
* Get state
*
* @return string
*/
public function getState()
{
return $this->state;
}
/**
* Set country
*
* @param string $country
* @return Stadium
*/
public function setCountry($country)
{
$this->country = $country;
return $this;
}
/**
* Get country
*
* @return string
*/
public function getCountry()
{
return $this->country;
}
/**
* Set capacity
*
* @param integer $capacity
* @return Stadium
*/
public function setCapacity($capacity)
{
$this->capacity = $capacity;
return $this;
}
/**
* Get capacity
*
* @return integer
*/
public function getCapacity()
{
return $this->capacity;
}
/**
* Set playingSurface
*
* @param string $playingSurface
* @return Stadium
*/
public function setPlayingSurface($playingSurface)
{
$this->playingSurface = $playingSurface;
return $this;
}
/**
* Get playingSurface
*
* @return string
*/
public function getPlayingSurface()
{
return $this->playingSurface;
}
}
我用来添加数据(如果不存在)和更新它(如果存在)的代码:
<?php
namespace FantasyPro\DataBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use FantasyPro\DataBundle\Entity\Stadium;
class DefaultController extends Controller
{
public function indexAction($name)
{
return $this->render('DataBundle:Default:index.html.twig', array('name' => $name));
}
public function updateStadiumAction(){
//get list of stadiums
$client = $this->container->get('fantasyapi');
$stadiumData = $client->Stadiums();
//var_dump($stadiumData);
//get the entity manager
$em = $this->getDoctrine()->getManager();
$repo = $em->getRepository('DataBundle:Stadium');
$log = $stadiumData;
foreach($stadiumData as $stadium){
// Get the current stadium in the list
$criteria = array("StadiumID" =>$stadium['StadiumID']);
var_dump($criteria);
$storedStadium = $repo->FindOneBy($criteria);
if (!$storedStadium) {
/* throw $this->createNotFoundException(
'No product found for id '.$stadium['StadiumID']
);*/
//no stadium exists with the StadiumID passed
//create a new entry
$entry = new Stadium();
$entry->setStadiumID($stadium['StadiumID']);
$entry->setName($stadium['Name']);
$entry->setCity($stadium['City']);
$entry->setState($stadium['State']);
$entry->setCountry($stadium['Country']);
$entry->setCapacity($stadium['Capacity']);
$entry->setPlayingSurface($stadium['PlayingSurface']);
$em->persist($entry);
$log .= 'Added New Stadium: '.$stadium['StadiumID'].' : '.$stadium['Name'].'<br>';
}else{
$storedStadium->setStadiumID($stadium['StadiumID']);
$storedStadium->setName($stadium['Name']);
$storedStadium->setCity($stadium['City']);
$storedStadium->setState($stadium['State']);
$storedStadium->setCountry($stadium['Country']);
$storedStadium->setCapacity($stadium['Capacity']);
$storedStadium->setPlayingSurface($stadium['PlayingSurface']);
$em->persist($storedStadium);
$log .= 'Updated Stadium: '.$stadium['StadiumID'].' : '.$stadium['Name'].'<br>';
}
}
//$em->flush();
return $this->render('DataBundle:Default:index.html.twig', array('log' => $log));
}
}
属性 名字实际上是:
private $stadiumID;
所以你应该这样做:
$repo->findOneBy(array('stadiumID' => $value));
所以更改此行:
$criteria = array("StadiumID" =>$stadium['StadiumID']);
对此:
$criteria = array("stadiumID" =>$stadium['StadiumID']);
Doctrine 的主要作用是将你的应用层(实体)连接到数据库层(表)。因此,学说试图将来自应用层的请求转换为数据库。即使您在数据库中将字段命名为 "StadiumID"
或 "table_name_snake_case"
,当您调用 findOneBy(array($property => $value))
时,学说也期望 $property
引用 属性 名称,并且它会将其翻译成 SQL 之类的 'SELECT FROM .... where StadiumID = :value'
对于仍有问题的其他人,
确保在调用函数 findOneBy(...)
时输入符号 '=>
' 而不是 ',
'
所以而不是:
findOneBy(["code" , "Code-Example"]);
这样做:
findOneBy(["code" => "Code-Example"]);
此外,请确保指定了学说命名策略:
doctrine:
orm:
naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
这是学说的默认命名策略。这样学说就知道如何将实体 属性 名称映射到列名称。 请注意,命名策略配置可能在不同级别的学说配置中。例如,在另一个 repo 中,它是这样配置的:
doctrine:
orm:
default_entity_manager: shopping
entity_managers:
shopping:
naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware