Doctrine2に、Models\UserとModels\Commentという相互に関連する2つのエンティティがあるとします。 Doctrine 2.0.0 .. ..
<?php
// $em instanceof EntityManager, $user instanceof Models\User
$comments = $em->getRepository('Models\Comment')
->findBy(array('user' => $user, 'public' => true));
... PHPエラーが発生します:
重大度:通知
メッセージ:クラスModels\Userのオブジェクトから文字列への変換
ファイル名:DBAL/Connection.php
行番号:574
これは起こらないはずですよね? QueryBuilderとsetParameter( 'user'、$ user)を使用すると、期待どおりに機能します。
関係によるクエリは許可されていますが、そこに識別子を渡す必要があります。オブジェクトによるクエリはまだサポートされておらず、2.1になります。
<?php
// $em instanceof EntityManager, $user instanceof Models\User
$comments = $em->getRepository('Models\Comment')
->findBy(array('user' => $user->getId(), 'public' => true));
Symfony 4.1の場合、このコードは私のために機能しました。
$comments = $this->getDoctrine()
->getRepository(Models\Comment::class)
->findBy(
['user' => $user->getId(), 'public' => true]
);
残念ながら、リレーションシップによるクエリは、リポジトリオブジェクトを介して直接サポートされているとは思いません。
この場合、findByUserメソッドを使用してカスタムリポジトリクラスを作成するのがおそらく最善です。
<?php
namespace App\Domain\Repository;
use Doctrine\ORM\EntityRepository,
App\Domain\Entity\User;
class CommentRepository extends EntityRepository
{
public function findByUser(User $user)
{
// add QueryBuilder code here
}
}
カスタムリポジトリを使用するようにコメントエンティティを更新することを忘れないでください。
<?php
namespace App\Domain\Entity;
/**
* @Entity(repositoryClass="App\Domain\Repository\CommentRepository")
*/
class Comment
{
// entity definition
}