2015-04-10 11 views
5

Ben giriş zaten var olmadığını görmek için findByOne çalıştığınızda i alandır söyleyerek bir hata alıyorum ben bir APISymfony2'nin Doktrini Tanınmayan alanı:

çekerek bazı verileri depolamak için bir Varlık oluşturduk tanınmadı.

Bir php app/konsol doktrini yaptık

: sağ fieldname i findByOne(); yaptığınızda 'StadiumID' Yani neden bunu doktrin bulmak benim mySQL yöneticisinde güncelleme Masayı görebilirsiniz --force: şema Benim Varlık Sınıfı:

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

o yok ve eğer var güncellemek için eğer ben veri eklemek için kullanıyorum kodu:

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

cevap

22

özellik adı aslında:

private $stadiumID; 
Yani yapmalıdır: Başvurunuz katmanı bağlamak için

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

doktrini ana rolü: Buna

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

:

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

yüzden bu satırı değiştirin (katman) veritabanı katmanına (tablolar). Böylece doktrin, uygulama katmanından gelen istekleri veritabanına aktarmaya çalışır. Eğer findOneBy(array($property => $value)) çağırdığınızda veritabanına "StadiumID" veya "table_name_snake_case", sizin alanını adında bile, doktrin özellik adı başvurmak için $property beklediğini ve harika cevap için 'SELECT FROM .... where StadiumID = :value'

+0

teşekkür gibi bir şey SQL bu çevirecek, orada Sütun isimleri için kullanılması gereken herhangi bir özel adlandırma kuralları, sütun isminin, kutudaki özellik adıyla aynı olmasını sağlamak iyi bir fikir midir? Büyük bir zevkle –

+1

! Sütun isminden bahsetmezseniz, doktrin, vaka adınızı (camelcase'de ise) otomatik olarak davanıza çevirecektir. Bunu, sql veritabanı kullanırken ve tutarlılık sağladığında en iyi uygulamaların bir kısmını kullanırken çok açık bir şekilde görüyorum. Ama hepsi iş mantığına ve veritabanını kimin işleyeceğine bağlı. Ayrıca, Bombardıman ismindeki sütunlar gibi bazı özellikler de (createdBy, updatedBy). Ayrıca, varlıklarınız için doktrin için adlandırma stratejisini de yapılandırabilirsiniz: https://coderwall.com/p/kj1reg/implementing-a-doctrine2-naming-strategy-in-symfony2 – anegrea