Dizzy Bryan High
Dizzy Bryan High

Reputation: 2061

Symfony2 Doctrine Unrecognized field:

I've created an Entity to store some data i'm pulling via an api

When i try to findByOne to see if the entry already exists, i get an error saying the field is not recognised.

I've done a php app/console doctrine:schema:update --force I can see the table in my mySQL manager with the right fieldname 'StadiumID' So why cant doctrine 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'm using to add the data if it does not exist and to update it if it does exist:

<?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));
    }
}

Upvotes: 19

Views: 43312

Answers (3)

Nuryagdy Mustapayev
Nuryagdy Mustapayev

Reputation: 775

Also, make sure the doctrine naming strategy is specified:

doctrine:
    orm:
        naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware

this is the doctrine's default naming strategy. This way doctrine knows how to map Entity property names to column names. Note that, naming strategy configuration might be in different levels of doctrine configuration. For example, in another repo it is configured like this:

doctrine:
    orm:
        default_entity_manager: shopping
        entity_managers:
            shopping:
                naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware

Upvotes: 0

Hicham O&#39;Sfh
Hicham O&#39;Sfh

Reputation: 841

For others who still have the problem,
make sur that you have puted the sign '=>' instead of ',' when calling the function findOneBy(...)
So instead of :

findOneBy(["code" , "Code-Example"]);

do that :

findOneBy(["code" => "Code-Example"]);

Upvotes: 7

alexandra
alexandra

Reputation: 1192

The property name is actually:

private $stadiumID;

So you should do :

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

so change this row:

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

to this:

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

Doctrine's main role is to connect your application layer(entites) to the database layer(tables). So doctrine tries to translate request comming from the application layer to 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 to refer to the property name, and it will translate this to SQL to something like 'SELECT FROM .... where StadiumID = :value'

Upvotes: 46

Related Questions