symfony 获取Doctrine实体内的最大ID

a64a0gku  于 2023-10-24  发布在  其他
关注(0)|答案(4)|浏览(124)

我需要获得symfony 2.7实体内表的最大ID。但不是有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
}

这就是我想得到最大身份证的部分

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_manager”部分。有没有一种方法可以在Entity内部调用教义查询?

iqjalb3h

iqjalb3h1#

如果我是你,我会这样做:

控制器:

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

它应该工作

sr4lhrrt

sr4lhrrt2#

我建议将EntityManager作为class variable保存在Entity中,并通过constructor或通过setter-method示例化它,在使用setRenderader函数之前调用setter-method
这应该是最清晰和最好的可读解决方案。

oxalkeyp

oxalkeyp3#

在您的 * 控制器 * 中尝试以下操作:

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

tsm1rwdh4#

从另一个线程我发现了这个,它为我工作。

global $kernel;

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

我不能在控制器中使用它,因为我有一个管理类而不是控制器。因为很多人建议在实体中使用实体_管理器不是好的做法,我使用管理类中的代码而不是实体。
这是最原始的thread。
如何在Entity中使用EntityManager?

相关问题