Wednesday, April 25, 2012

Doctrine2 findBy relationship object triggers string conversion error


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.


Source: Tips4all

2 comments:

  1. 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));

    ReplyDelete
  2. 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

    }

    ReplyDelete