web-dev-qa-db-ja.com

TwigおよびSymfony2-エンティティが見つかりませんでした

他のエンティティに関連するエンティティがあります。最後に、tatのようなオブジェクトがあります。

paper.submission.authors

一部のpaper.submissionについては、作成者がいません。私のtwigテンプレートでは、次のことを行っています。

{% for author in paper.submission.authors}
    do something
{% endfor %}

また、著者がいないpaper.submissionの場合、「エンティティが見つかりませんでした」という例外が発生します。

私のforループの前にオブジェクトが存在するかどうかをテストする可能性はありますか?.

私は定義されていることを試しましたが、それは常に真実です。次に、nullではないことを試しましたが、これも例外を生成しています。

事前にどうもありがとうございました。

15
Miloš

問題

Doctrineは、関連するエンティティが見つからない場合、この例外をスローします。これを言うのは冗長に思えますが、実際にはこれは重要です。
これは、それに関連するIDを見つけることができたが、行われたリクエストdoctrineがどの結果とも一致しなかったことを意味します。

私の推測では、データベーステーブル(実際にはリンクテーブル)submission.authorsには、NULLではなく0のIDが含まれています。
このように、Doctrineはそこにあると思います[〜#〜] is [〜#〜] IDが0であるため、作成者が見つかりません。

何が起こるのですか

submission.authorsは常に存在します。これはUninitializedDoctrineプロキシです。

var_dump($submission->getAuthors());

正確にsubmission.authorsが含まれているものを表示します
この時点では、クエリは実行されません。 PersistentCollection フラグ付き isInitialized をfalseに返すだけです。

例外は、プロパティを取得しようとしたときに発生します

foreach ($submission->getAuthors() as $author) {
}

これを行うと、doctrine getAuthorsが初期化されているかどうかがチェックされます。初期化されていない場合は、次のクエリが実行されます

SELECT <stuffs> FROM authors WHERE id = 0;

これは一致を返さず、 EntityNotFound 例外をスローします

修正

Id行のデフォルトをNULLに設定し、クエリを実行してすべての0NULLに更新する必要があります。
これにより、submission.authorsis not nullで簡単にテストできます。

Doctrineは、NULLが見つかった場合、クエリを実行しません。

28
Touki

どの関連エンティティが見つからなかったかをデバッグする方法は?

リポジトリで例外メッセージが改善されました https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/Proxy/ProxyFactory.php#L16 ただし、古いバージョンを使用している場合は、次のデバッグ。

古いバージョンを使用している場合

次のコードをthrow new EntityNotFoundException();行の前のProxyFactoryクラスに配置しますvendor/doctrine/orm/lib/Doctrine/ORM/Proxy/ProxyFactory.php:177

$entity = $classMetadata->getReflectionClass()->getShortName();
$id = $classMetadata->getIdentifierValues($proxy)['id'];
var_dump("$entity WHERE id = $id NOT FOUND.");exit;
throw new EntityNotFoundException();
6
Farid Movsumov

あなたのエンティティでは、次のようなものを作成できます。

public function getSubmission(){
    if($this->Submission->getId()==0) return null;
    return $this->Submission;
}