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