J'ai créé une entité pour stocker des données que je tire via une API
Lorsque j'essaie de trouver FindByOne pour voir si l'entrée existe déjà, j'obtiens une erreur indiquant que le champ n'est pas reconnu.
J'ai fait une doctrine d'application/console php: schéma: mise à jour --force Je peux voir le tableau dans mon gestionnaire mySQL avec le bon nom de champ 'StadiumID' Alors pourquoi ne peux-je pas doctrine le trouver quand je do findByOne();
Ma classe d'entité:
<?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;
}
}
Le code que j'utilise pour ajouter les données si elles n'existent pas et pour les mettre à jour si elles existent:
<?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));
}
}
Le nom de la propriété est en fait:
private $stadiumID;
Vous devez donc faire:
$repo->findOneBy(array('stadiumID' => $value));
alors changez cette ligne:
$criteria = array("StadiumID" =>$stadium['StadiumID']);
pour ça:
$criteria = array("stadiumID" =>$stadium['StadiumID']);
Le rôle principal de la doctrine est de connecter votre couche d'application (entites) à la couche de base de données (tables). Donc doctrine essaie de traduire la demande provenant de la couche application vers la base de données. Même si vous avez nommé votre champ dans la base de données "StadiumID"
Ou "table_name_snake_case"
, Lorsque vous appelez findOneBy(array($property => $value))
, doctrine s'attend à ce que $property
fasse référence au nom de la propriété, et il le traduira en SQL en quelque chose comme 'SELECT FROM .... where StadiumID = :value'