Symfony2学说无法识别的字段: [英] Symfony2 Doctrine Unrecognized field:

查看:78
本文介绍了Symfony2学说无法识别的字段:的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个实体来存储一些我通过api提取的数据

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

当我尝试findByOne来查看条目是否已经存在时,我得到了

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

我已经完成了一个php应用程序/控制台准则:schema:update --force
我可以看到表格在我的mySQL管理器中具有正确的字段名'StadiumID'
那么为什么当我做 findByOne();
我的实体类时,为什么教义找不到它? / p>

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


推荐答案

属性名称实际上是:

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 ....,其中StadiumID =:value'

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'

这篇关于Symfony2学说无法识别的字段:的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆