0

ユーザー オブジェクトと多対 1 の関係を持つ LastTrait オブジェクトがあります。1 人のユーザーがさまざまな 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());

LastTrait オブジェクトを取得する必要があるにもかかわらず、常に NULL を取得します。

ここで何が間違っていますか?

4

3 に答える 3

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の回答により、カスタムのリポジトリクラスさえ必要ないことに気付きました。コントローラーから通常の findOneBy 関数を使用するだけで、必要なものを取得できます。

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

外部キーではなく、エンティティでもっと考えるべきだと思います。

あなたの方法でこれを試してください。

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

->getVerse()->getId(); を呼び出すことができます。この後、またはメソッドで直接IDを返します(将来の使用IMOには狭すぎます)。

これは、ユーザーがカテゴリごとに 1 つの特性しか持っていない場合にのみ機能します。それ以外の場合は、特定の特性を取得するのに十分なデータがありません。

于 2013-03-05T16:23:11.827 に答える
0

わかりにくい。結果を取得する前に、DQLまたはSQLのいずれかをエコーし​​てみてください。

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

何らかの理由で、無効なマッピング(上記には表示されていません)がある場合は、ここに表示されます。

try-catchまた、最も一般的なキャッチでメソッドをラッピングしExceptionて、何かをキャッチするかどうかを確認してみてください...

さらに、私を悩ませているのは、あなたがNULL戻ってきたという事実です...

于 2013-03-05T16:09:54.670 に答える