Doctrine2 findBy 关系对象触发字符串转换错误

Posted

技术标签:

【中文标题】Doctrine2 findBy 关系对象触发字符串转换错误【英文标题】:Doctrine2 findBy relationship object triggers string conversion error 【发布时间】:2011-01-06 19:41:26 【问题描述】:

假设我在 Doctrine2 中有两个相互关联的实体,Models\User 和 Models\Comment。如果我在 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) 它会按预期工作。

【问题讨论】:

【参考方案1】:

允许按关系查询,但您必须在其中传递标识符。尚不支持按对象查询,仅支持 2.1。

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

【讨论】:

@beberlei 嗨,我想知道此功能是否仍在路线图中(按对象查询)。我试图通过 Jira 寻找任何东西都没有成功 @beberlei : 教义 2.1.6 仍然存在这个问题,这正常吗?【参考方案2】:

对于 symfony 4.1,这段代码对我有用。

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

【讨论】:

【参考方案3】:

不幸的是,我不认为直接通过存储库对象支持按关系进行查询。

在这种情况下,您可能最好使用 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


【讨论】:

以上是关于Doctrine2 findBy 关系对象触发字符串转换错误的主要内容,如果未能解决你的问题,请参考以下文章

教义 findby 关系

在findBy之后,Doctrine用急切的读取值重写关系

基于模型实例获取学说结果

从doctrine2中的代理对象获取“true”对象

如何在 @OneToMany 关系映射的列上使用 JPA findBy 查询?

一个双向 Doctrine2 关系的性能是不是低于两个单向关系?