我创建了一个实体来存储我通过api拉出的一些数据
当我尝试findByOne以查看该条目是否已存在时,我收到一条错误消息,指出该字段无法识别。
我已经完成了一个php app / console学说:schema:update --force
我可以在mySQL管理器中看到正确的字段名称' StadiumID'
那么,当我做findByOne();
时为什么不能学说呢?
我的实体类:
<?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;
}
}
代码i用于添加数据(如果数据不存在),如果数据存在则更新它:
<?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));
}
}
答案 0 :(得分:30)
属性名称实际上是:
private $stadiumID;
所以你应该这样做:
$repo->findOneBy(array('stadiumID' => $value));
所以改变这一行:
$criteria = array("StadiumID" =>$stadium['StadiumID']);
到此:
$criteria = array("stadiumID" =>$stadium['StadiumID']);
Doctrine的主要作用是将您的应用程序层(entites)连接到数据库层(表)。因此,doctrine尝试将请求从应用程序层转换为数据库。即使您在数据库"StadiumID"
或"table_name_snake_case"
中命名了您的字段,当您致电findOneBy(array($property => $value))
时,doctrine希望$property
引用该属性名称,并将其转换为SQL类似于'SELECT FROM .... where StadiumID = :value'
答案 1 :(得分:0)
对于仍有问题的其他人,
确保在调用函数=>
时已放置符号',
'而不是'findOneBy(...)
'
因此,代替:
findOneBy(["code" , "Code-Example"]);
这样做:
findOneBy(["code" => "Code-Example"]);