【问题标题】:Why does the Doctrine getter method return null for the ID?为什么 Doctrine getter 方法返回的 ID 为 null?
【发布时间】:2014-01-21 15:44:49
【问题描述】:

我在 Symfony 项目的 class table inheritance 设置中使用自动生成的 getter。 getId() 返回 null,而其他所有 getter 都有效。你能发现任何问题吗?我应该搜索什么?我手动导入了数据库条目,但我认为这不是原因。

抽象父实体

//src/Acme/WebzineBundle/Entity/Content.php
namespace Acme\WebzineBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Content
 *
 * @ORM\Table()
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="heading", type="integer")
 * @ORM\DiscriminatorMap({
 *   0 = "Review"
 * })
 */
abstract class Content
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="edited", type="date")
     */
    private $edited;


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

    /**
     * Get edited
     *
     * @return \DateTime 
     */
    public function getEdited()
    {
        return $this->edited;
    }
}

子实体

//src/Acme/WebzineBundle/Entity/Review.php
namespace Acme\WebzineBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Review articles
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Review extends Content
{
    /**
     * @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=127)
     */
    private $title;


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

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

下一个外键约束在子实体的表上:

CONSTRAINT `FK_7EEF84F0BF396750` FOREIGN KEY (`id`) REFERENCES `Content` (`id`)
ON DELETE CASCADE

查询

//src/Acme/AdminBundle/Controller/MainController.php
namespace Acme\AdminBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;

class MainController extends Controller
{
    public function indexAction(Request $request)
    {
        $em = $this->getDoctrine()->getManager();
        $query = $em->createQuery(
            'SELECT post FROM AcmeWebzineBundle:Content post
             ORDER BY post.edited DESC'
        );
        $query->setMaxResults(30);

        $posts = $query->getResult();
        $latest_post = $posts[0];

        return $this->render('AcmeAdminBundle:Main:index.html.twig', array(
            'posts' => $posts,
            'id' => gettype($latest_post->getId()), // This returns null!
            'edited' => $latest_post->getEdited(),  // Any other getter works
            'title' => $latest_post->getTitle(),    // also from the child entity.
        ));
    }
}

【问题讨论】:

  • 可能是因为您定义了两次id 属性
  • 尝试从抽象类中删除id属性和getId()方法

标签: php symfony doctrine-orm


【解决方案1】:

您需要从子类中删除id 属性和getId() 方法

//src/Acme/WebzineBundle/Entity/Review.php
namespace Acme\WebzineBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Review articles
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Review extends Content
{ 
    /**
     * @var string
     *
     * @ORM\Column(name="title", type="string", length=127)
     */
    private $title;


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

您不能创建Content 类的对象。

并且更好只使用Review类中的唯一属性和方法,因为其他的都是从抽象Content类继承的。

【讨论】:

  • 那么我应该如何在 Content 实体上设置主键呢?如果我删除$id 属性,我会收到下一个错误:没有为实体“Acme\WebzineBundle\Entity\Content”指定标识符/主键。每个实体都必须有一个标识符/主键。
  • 尝试将$id 属性添加到Content 并从Review 中删除
猜你喜欢
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
相关资源
最近更新 更多