他のエンティティに関連するエンティティがあります。最後に、tatのようなオブジェクトがあります。
paper.submission.authors
一部のpaper.submissionについては、作成者がいません。私のtwigテンプレートでは、次のことを行っています。
{% for author in paper.submission.authors}
do something
{% endfor %}
また、著者がいないpaper.submissionの場合、「エンティティが見つかりませんでした」という例外が発生します。
私のforループの前にオブジェクトが存在するかどうかをテストする可能性はありますか?.
私は定義されていることを試しましたが、それは常に真実です。次に、nullではないことを試しましたが、これも例外を生成しています。
事前にどうもありがとうございました。
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
に設定し、クエリを実行してすべての0
をNULL
に更新する必要があります。
これにより、submission.authors
をis not null
で簡単にテストできます。
Doctrineは、NULL
が見つかった場合、クエリを実行しません。
どの関連エンティティが見つからなかったかをデバッグする方法は?
リポジトリで例外メッセージが改善されました 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();
あなたのエンティティでは、次のようなものを作成できます。
public function getSubmission(){
if($this->Submission->getId()==0) return null;
return $this->Submission;
}