0

我有一个 LastTrait 对象,它与我的用户对象具有多对一关系:一个用户可以有许多不同的 lastTrait:

YOP\YourOwnPoetBundle\Entity\LastTrait:
  type: entity
  table: null
  fields:
id:
  type: integer
  id: true
  generator:
    strategy: AUTO
traitCategoryID:
  type: integer
verseID:
  type: integer
  manyToOne:
user:
  targetEntity: User
  inversedBy: lastTrait
  joinColumn:
      name: user_id
      referencedColumnName: id

我需要知道 userID 和 traitCategoryID 来检索 verseID。所以我为我的 LastTrait 对象创建了一个存储库:

<?php

namespace YOP\YourOwnPoetBundle\Repository;

use Doctrine\ORM\EntityRepository;

class LastTraitRepository extends EntityRepository {

public function findOneByTraitCategoryID($userID, $traitCategoryID)
{
    return $this->getEntityManager()
    ->createQuery('SELECT l
        FROM YOPYourOwnPoetBundle:LastTrait l
        JOIN l.user u
        WHERE l.traitCategoryID = :categoryID AND u.id = :userID')
    ->setParameters(array(
        'categoryID' => $traitCategoryID,
        'userID' => $userID,
    ))
    ->getResult();
}
}

?>

但是,当我打电话时:

$lastTrait = $this->getDoctrine()
        ->getRepository('YOPYourOwnPoetBundle:LastTrait')
        ->findOneByTraitCategoryID($user->getID(), $collector->getTraitCategory()->getID());

我总是得到 NULL,即使我应该得到一个 LastTrait 对象!

我在这里做错了什么?

4

3 回答 3

1

我认为您应该更多地考虑实体,而少考虑外键。

用你的方法试试这个。

public function findOneByTraitCategoryID($userID, $traitCategoryID)
{
     return $this->findOneBy(
            array(
            'traitcategoryID' => $traitCategoryID,
            'user' => $userID
            ));
}

你可以调用 ->getVerse()->getId(); 在此之后或直接在方法上返回 id(对于未来使用 IMO 来说太窄了)。

这仅在用户每个类别只有一个特征时才有效,否则您没有足够的数据来获取特定特征。

于 2013-03-05T16:23:11.827 回答
1

问题是我忘记在我的实体中注册存储库:

YOP\YourOwnPoetBundle\Entity\LastTrait:
  repositoryClass: YOP\YourOwnPoetBundle\Repository\LastTraitRepository
  type: entity
  table: null
  fields:
id:
  type: integer
  id: true
  generator:
    strategy: AUTO
traitCategoryID:
  type: integer
verseID:
  type: integer
  manyToOne:
user:
  targetEntity: User
  inversedBy: lastTrait
  joinColumn:
      name: user_id
      referencedColumnName: id

添加 repositoryClass 行后,我的自定义 Repository 类被调用,我得到了想要的结果。

然而,@dhunter 的回答让我意识到我什至不需要自定义 Repository 类。我可以通过简单地使用我的控制器中的常规 findOneBy 函数来获得所需的:

$lastTrait = $this->getDoctrine()
  ->getRepository('YOPYourOwnPoetBundle:LastTrait')
  ->findOneBy(
      array('user' => $user->getId(), 'traitCategoryID' => $collector->getTraitCategory()->getID())
  );
于 2013-03-07T01:43:59.033 回答
0

很难说。在检索结果之前尝试回显 DQL 或 SQL:

$q = $this->getEntityManager()->createQuery(....);
die($q->getSql()); //or getDql();

如果由于某种原因,您的映射无效(我在上面没有看到),您应该在这里看到它。

另外,尝试try-catch用最一般的Exception捕获方法包装方法,看看它是否捕获任何东西......

此外,困扰我的是你NULL回来的事实......

于 2013-03-05T16:09:54.670 回答