【问题标题】:Symfony/Doctrine: Class is not a valid entity or mapped super classSymfony/Doctrine:类不是有效的实体或映射的超类
【发布时间】:2013-07-20 18:55:01
【问题描述】:

我收到“Class PriceOrQuality\POQBundle\Entity\Tag 不是有效实体或映射的超类错误。我已经检查了类似问题的所有答案,但我似乎无法理解问题所在。

错误是由我的存储库类引发的

<?php

namespace PriceOrQuality\POQBundle\Entity\Repository;

use Doctrine\ORM\EntityRepository as ER;
use PriceOrQuality\POQBundle\Entity\Tag;
use Doctrine\ORM\EntityManager;

/**
 * EntityTagsRepository
 *
 */
class EntityTagsRepository extends ER
{
    public function getTagsForTagCloud($entity_ids = null, $tag_id = null) {

        $em = $this->getEntityManager();

        $qb = $em->createQueryBuilder();
        $qb->select(array('IDENTITY(et.tag) as id, COUNT(et.tag) as tag_id_count, LOWER(t.tag) as tag'));
        $qb->from('PriceOrQuality\POQBundle\Entity\EntityTag', 'et');
        $qb->leftjoin('PriceOrQuality\POQBundle\Entity\Tag','t', 'WITH', 'et.tag = t.id');
        $qb->groupBy('et.tag');
        $qb->addOrderBy('tag_id_count','DESC');
        $qb->setMaxResults(20);      
        return $qb->getQuery()
                ->getResult();
    }
}

Tag 类在此文件 (Tag.php) 中定义(仅定义):

<?php

namespace PriceOrQuality\POQBundle\Entity;

// src/PriceOrQuality/POQBundle/Entity/Tag.php

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use PriceOrQuality\POQBundle\Entity\EntityTag;
use PriceOrQuality\POQBundle\Entity\User;
use JMS\SerializerBundle\Serializer\Serializer;

/**
 * @ORM\Entity(repositoryClass="PriceOrQuality\POQBundle\Entity\Repository\TagsRepository")
 * @ORM\Table(name="tags")
 * @ORM\HasLifecycleCallbacks 
 */

你们中的任何聪明人都知道从哪里开始调试吗?

提前致谢,

符文

【问题讨论】:

  • 您能告诉我们最后一个 DocBlock 下方是否有什么特别之处吗?像一个扩展类?或者错误是在哪里引发的(哪一行触发它)?因为乍一看,我正在研究这个问题。
  • 查询抛出错误。根据日志,它是抛出它的 getResult()。

标签: php symfony


【解决方案1】:

发现问题。

我在元定义之后和类定义之前有一个 //@todo。显然,这搞砸了映射,因为它没有在教义中映​​射。

移动 //@todo 并重新运行映射解决了问题。

如果有人发现这个问题有类似问题,请尝试运行:

php app/console doctrine:mapping:info

如果你在学说中的映射结构有问题,它会告诉你

感谢你们的时间。

干杯, 符文

【讨论】:

  • 好的,很高兴听到您找到它。请将您自己的答案标记为已解决? ;)
  • 谢谢,我会的——但显然不能在明天之前。 :)
【解决方案2】:

阅读一下查询生成器。它比 sql 查询更容易且不同。不需要加入条件。

这个(对于初学者):

$qb->leftjoin('PriceOrQuality\POQBundle\Entity\Tag','t', 'WITH', 'et.tag = t.id');

应该是:

$qb->leftJoin('et.tag','t');

可能会有更多问题,但这会让你开始。 http://docs.doctrine-project.org/en/latest/reference/query-builder.html

【讨论】:

  • 好吧,不要认为这是问题所在。我最初也是这么想的,所以我在课堂上尝试过。令人惊讶的是,它起作用了......?编辑:好吧,使用实体上的实体,而不是此处所述的 ID 上的实体,但仍然如此。
  • 我已经阅读了查询生成器。我有一个多对多的关系,分为三个表(和相应的)类。所以我需要控制连接的方式。做你建议的 Cerad 会产生错误的结果。 @UrGuardianAngel et.tag 是 ET 类中的 id 字段,因此它对应于 ID,它是 Tag 类的 ID 字段。如果我包含三个类:Tag、Entity、EntityTag,会有帮助吗?
猜你喜欢
  • 2016-09-09
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多