Doctrine2 findBy relationship object triggers stri

2019-01-17 21:14发布

Say I have two entities in Doctrine2 that are related to each other, Models\User and Models\Comment. If I do this in Doctrine 2.0.0...

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

...I get a PHP error:

Severity: Notice

Message: Object of class Models\User to string conversion

Filename: DBAL/Connection.php

Line Number: 574

This shouldn't happen, right? If I use the QueryBuilder and setParameter('user', $user) it works as expected.

3条回答
时光不老,我们不散
2楼-- · 2019-01-17 21:54

Query by relationship is allowed, but you have to pass the Identifier in there. Query by object is not yet supported and will only make it into 2.1.

<?php
// $em instanceof EntityManager, $user instanceof Models\User
$comments = $em->getRepository('Models\Comment')
->findBy(array('user' => $user->getId(), 'public' => true));
查看更多
迷人小祖宗
3楼-- · 2019-01-17 22:06

Unfortunately, I don't think query by relationships is supported directly via repository objects.

In this case, you are probably best to write a custom repository class with a findByUser method.

<?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
    }

}

Don't forget to update your Comment entity to use the custom repository:

<?php

namespace App\Domain\Entity;


/** 
 * @Entity(repositoryClass="App\Domain\Repository\CommentRepository")
 */
class Comment 
{

    // entity definition

}
查看更多
Evening l夕情丶
4楼-- · 2019-01-17 22:11

For symfony 4.1 this code worked for me.

$comments = $this->getDoctrine()
                ->getRepository(Models\Comment::class)
                ->findBy(
                ['user' => $user->getId(), 'public' => true]
);
查看更多
登录 后发表回答