2016-04-29 6 views
0

Ich muss die maximale ID einer Tabelle innerhalb von Symfony 2.7 Entity erhalten. Aber anstatt die ID zu bekommen, bekomme ich dieses Problem.Erhalte maximale ID innerhalb Doctrine entity

Hinweis: nicht definierte Eigenschaft: AppBundle \ Entity \ Blogpost :: $ container

Das ist meine Blogpost Einheit,

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\HttpFoundation\File\UploadedFile; 

/** 
* BlogPost 
* 
* @ORM\Table() 
* @ORM\Entity 
*/ 
class BlogPost { 

    const SERVER_PATH_TO_IMAGE_FOLDER = '/uploads'; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="title", type="string", length=255) 
    */ 
    private $title; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="body", type="text") 
    */ 
    private $body; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="filename", type="text") 
    */ 
    private $filename; 

    /** 
    * Set filename 
    * 
    * @param string $filename 
    * @return BlogPost 
    */ 
    public function setFilename($filename) { 
     $this->filename = $filename; 

     return $this; 
    } 

    public function setUploader(UploadedFile $file) { 
     $em = $this->container->get('doctrine.orm.entity_manager'); 
     $highest_id = $em->createQueryBuilder() 
       ->select('MAX(b.id)') 
       ->from('AppBundle:BlogPost', 'b') 
       ->getQuery() 
       ->getSingleScalarResult(); 

     var_dump($highest_id); 
     exit();// exit for check value 

     $url = 'uploads/events'; 
     $file_name = 'fsdf.' . $file->guessExtension(); 
     $file->move($url, $file_name); 
    } 

    /** 
    * Get filename 
    * 
    * @return string 
    */ 
    public function getFilename() { 
     return $this->filename; 
    } 

    /** 
    * @var boolean 
    * 
    * @ORM\Column(name="draft", type="boolean") 
    */ 
    private $draft; 

    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() { 
     return $this->id; 
    } 

    /** 
    * Set title 
    * 
    * @param string $title 
    * @return BlogPost 
    */ 
    public function setTitle($title) { 
     $this->title = $title; 

     return $this; 
    } 

    /** 
    * Get title 
    * 
    * @return string 
    */ 
    public function getTitle() { 
     return $this->title; 
    } 

    /** 
    * Set body 
    * 
    * @param string $body 
    * @return BlogPost 
    */ 
    public function setBody($body) { 
     $this->body = $body; 

     return $this; 
    } 

    /** 
    * Get body 
    * 
    * @return string 
    */ 
    public function getBody() { 
     return $this->body; 
    } 

    /** 
    * Set draft 
    * 
    * @param boolean $draft 
    * @return BlogPost 
    */ 
    public function setDraft($draft) { 
     $this->draft = $draft; 

     return $this; 
    } 

    /** 
    * Get draft 
    * 
    * @return boolean 
    */ 
    public function getDraft() { 
     return $this->draft; 
    } 

    /** 
    * @ORM\ManyToOne(targetEntity="Category", inversedBy="blogPosts") 
    */ 
    private $category; 

    public function setCategory(Category $category) { 
     $this->category = $category; 
    } 

    public function getCategory() { 
     return $this->category; 
    } 

    /** 
    * Unmapped property to handle file uploads 
    */ 
    public $file; 

    /** 
    * Sets file. 
    * 
    * @param UploadedFile $file 
    */ 
    public function setFile(UploadedFile $file = null) { 
     $this->file = $file; 
    } 

    /** 
    * Get file. 
    * 
    * @return UploadedFile 
    */ 
    public function getFile() { 
     return $this->file; 
    } 

    /** 
    * Manages the copying of the file to the relevant place on the server 
    */ 
    public function upload() { 
     // the file property can be empty if the field is not required 
     if (null === $this->getFile()) { 
      return; 
     } 

     // we use the original file name here but you should 
     // sanitize it at least to avoid any security issues 
     // move takes the target directory and target filename as params 
     $this->getFile()->move(
       self::SERVER_PATH_TO_IMAGE_FOLDER, $this->getFile()->getClientOriginalName() 
     ); 

     // set the path property to the filename where you've saved the file 
     $this->filename = $this->getFile()->getClientOriginalName(); 

     // clean up the file property as you won't need it anymore 
     $this->setFile(null); 
    } 

    /** 
    * Lifecycle callback to upload the file to the server 
    */ 
    public function lifecycleFileUpload() { 
     $this->upload(); 
    } 

    /** 
    * Updates the hash value to force the preUpdate and postUpdate events to fire 
    */ 
    public function refreshUpdated() { 
//  $this->setUpdated(new \DateTime()); 
    } 

// ... the rest of your class lives under here, including the generated fields 
//  such as filename and updated 
} 

Dies ist der Teil Ich versuche, max zu erhalten id,

public function setUploader(UploadedFile $file) { 
     $em = $this->container->get('doctrine.orm.entity_manager'); 
     $highest_id = $em->createQueryBuilder() 
       ->select('MAX(b.id)') 
       ->from('AppBundle:BlogPost', 'b') 
       ->getQuery() 
       ->getSingleScalarResult(); 

     var_dump($highest_id); 
     exit();// exit for check value 

     $url = 'uploads/events'; 
     $file_name = 'fsdf.' . $file->guessExtension(); 
     $file->move($url, $file_name); 
    } 

Mit Hilfe von Kommentaren und ein paar Recherchen habe ich herausgefunden, das Problem ist in 'entity_manager' Teil. Gibt es eine Möglichkeit, Doktrinabfragen innerhalb von Entity aufzurufen?

+1

Haben Sie an einem bestimmten Punkt '$ this-> container? Auch sollten Sie dies überdenken, sollten Ihre Modellklassen den Container nicht kennen. – Yoshi

+2

Es ist Ihr Aufruf von Entity Manager, ich weiß nicht, ob Sie das in einer Entity-Klasse tun können. Versuchen Sie dies in einer Repository-Klasse und führen Sie Ihre Logik in einem Controller aus. Darüber hinaus ist Anruf em in einer Entität keine gute Praxis – Letsrocks

+0

Zusätzlich zu dem, was alle anderen sagten (tun Sie es nicht innerhalb einer Entität!) es ist wahrscheinlich auch eine schlechte Übung, nach der höchsten ID zu fragen - kannst du mir ein bisschen erklären, warum du das brauchst? – LBA

Antwort

6

Wenn ich Sie wäre, würde ich so etwas tun:

Controller:

$blogPost= new BlogPost() ; 
$em = $this->getDoctrine()->getManager(); 
//..your code 
// I assume you want to do that after a form post 
$blogPost = $form->getData(); 
$id = $em->getRepository('AppBundle:BlogPost')->getMaxId(); 
$blogPost->setUploader($id); 
//... 

Repository:

public function getMaxId() 
{ 
    $qb = $this->createQueryBuilder('u'); 
    $qb->select('u, MAX(id) as idMax'); 
    return $qb->getQuery()->getSingleResult(); 
} 

Entity:

public function setUploader(UploadedFile $file, $id) 
{ 
    var_dump($id); 
    $url = 'uploads/events'; 
    $file_name = 'fsdf.'.$id.$file->guessExtension(); 
    $file->move($url, $file_name); 
} 

Es soll

arbeiten
+0

Es tut mir wirklich leid, aber leider kann ich nicht Controller auf diesem – vimuth

+1

verwenden Oh, gut, schauen Sie sich die Antwort von diesem Beitrag http://StackOverflow.com/Questions/14684745/get-entitymanager-inside-an-entity. Er erklärt, wie em in einer Entität zu verwenden – Letsrocks

+0

Um ehrlich zu sein habe ich die Lösung früher ausgecheckt, aber ich konnte es nicht verstehen. Es tut mir wirklich leid, aber ich bin ein bisschen neu darin ... Und wenn du es modifizieren und deiner Antwort hinzufügen kannst, wäre es eine große Hilfe für mich und ich akzeptiere es definitiv als richtige Antwort :) – vimuth

1

die Sie interessieren in Ihrem -Controller:

$blogPost= new BlogPost() ; 
$em = $this->getDoctrine()->getManager(); 
$blogPost = $form->getData(); 
$id = $em->getRepository('AppBundle:BlogPost')->createQueryBuilder('b') 
    ->where("MAX(b.id) as id") 
    ->getQuery() 
    ->getResult(); 
0

Formular einen anderen Thread fand ich diese und es ist für mich zu arbeiten.

global $kernel; 
if ('AppCache' == get_class($kernel)) 
{ 
    $kernel = $kernel->getKernel(); 
} 
$em = $kernel->getContainer()->get('doctrine.orm.entity_manager'); 

Ich kann es nicht in Controller verwenden, weil ich eine Admin-Klasse anstelle von Controller auf diesem haben. Da viele Leute dies mit Entity_Manager in Entity nicht empfehlen, verwende ich den Code innerhalb der Admin-Klasse anstelle von Entity.

Dies ist der ursprüngliche Thread ..
How to use entityManager inside Entity?

1

würde ich vorschlagen, die EntityManager als class variable in Ihrem Entity und entweder instanziiert es über die constructor oder über eine setter-method, die Sie anrufen halten, bevor Sie die verwenden setUploader-Funktion.

Dies sollte die sauberste und am besten lesbare Lösung sein.

Verwandte Themen