在Doctrine实体

时间:2016-04-29 11:55:09

标签: symfony doctrine-orm entity query-builder

我需要获取symfony 2.7实体内的表的最大ID。但我没有得到这个问题,而是得到了这个问题。

  

注意:未定义的属性:AppBundle \ Entity \ BlogPost :: $ container

这是我的BlogPost实体,

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

这是我尝试获取最大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);
    }

在评论和一些研究的帮助下,我发现问题出在“实体管理者”中。部分。有没有办法在Entity中调用doctrine查询?

4 个答案:

答案 0 :(得分:6)

如果我是你,我会做那样的事情:

<强>控制器:

$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);
//...

<强>存储库:

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

<强>实体:

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

应该有效

答案 1 :(得分:1)

控制器

中尝试此操作
$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();

答案 2 :(得分:1)

我建议您将EntityManager作为class variable放在Entity内,然后通过constructor或通过您调用的setter-method进行实例化在使用setUploader函数之前。

这应该是最干净,最易读的解决方案。

答案 3 :(得分:0)

形成另一个我找到的线程并且它为我工作。

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

我无法在控制器中使用它因为我有一个管理类而不是控制器。由于许多人在实体内部使用entity_manager建议这不是一个好习惯,我使用管理类中的代码而不是实体。

这是原始帖子..
How to use entityManager inside Entity?