web-dev-qa-db-ja.com

Doctrine2findBy関係オブジェクトが文字列変換エラーをトリガーします

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)を使用すると、期待どおりに機能します。

19
pdd

関係によるクエリは許可されていますが、そこに識別子を渡す必要があります。オブジェクトによるクエリはまだサポートされておらず、2.1になります。

<?php
// $em instanceof EntityManager, $user instanceof Models\User
$comments = $em->getRepository('Models\Comment')
->findBy(array('user' => $user->getId(), 'public' => true));
31
beberlei

Symfony 4.1の場合、このコードは私のために機能しました。

$comments = $this->getDoctrine()
                ->getRepository(Models\Comment::class)
                ->findBy(
                ['user' => $user->getId(), 'public' => true]
);
0
vimuth

残念ながら、リレーションシップによるクエリは、リポジトリオブジェクトを介して直接サポートされているとは思いません。

この場合、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

}
0
Cobby