Symfony2 Doctrine Unrecognized field:

I created Entity to store some data that I pull through api

When I try to find ByOne to find out if a record exists, I get an error when the field is not recognized.

I made the doctrine php app / console: schema: update --force I see a table in my mySQL manager with the correct field name 'StadiumID' So, why the doctrine can not find it when I do findByOne(); My Entity 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; } } 

The code I use to add data if it does not exist and update it if it exists:

 <?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)); } } 
+5
source share
1 answer

Actually the property name:

 private $stadiumID; 

So you should do:

 $repo->findOneBy(array('stadiumID' => $value)); 

change this line:

 $criteria = array("StadiumID" =>$stadium['StadiumID']); 

:

 $criteria = array("StadiumID" =>$stadium['StadiumID']); 

The main role of Doctrine is to connect your application layer (entites) to the database layer (table). Therefore, the doctrine is trying to translate the request coming from the application level into the database. Even if you named your field in the database "StadiumID" or "table_name_snake_case" when you call findOneBy(array($property => $value)) , doctrine expects $property refer to the property name, and this will translate this into SQL to something like 'SELECT FROM .... where StadiumID = :value'

+23
source

All Articles