首页 > 解决方案 > 在 symfony 4 中如何以及在何处执行自定义查询

问题描述

我正在使用一个像这样扩展ServiceEntityRepository的实体类:

class Sms extends ServiceEntityRepository
{ 
   public function __construct(ManagerRegistry $registry)
   {
       parent::__construct($registry, Sms::class);
   }
... 
}

所以当我需要在我的控制器文件中持久化实体类的实例时,我需要将 ManagerRegistry 作为我的实体类的参数传递,但我找不到ManagerRegistry在我的控制器中访问它的方法。

谁能帮忙?

标签: symfonydoctrine-ormsymfony4

解决方案


问题是ServiceEntityRepository应该在存储库类中扩展,而不是实体类。正如这里提到的,对于从现有数据库自动生成存储库没有很好的描述。这是我的实体类及其注释:

/**
* Sms
*
* @ORM\Table(name="sms")
* @ORM\Entity(repositoryClass="App\Repository\SMSRepository")
 */
class Sms
{ ... }

这一行非常重要:@ORM\Entity(repositoryClass="App\Repository\SMSRepository")

另一个重要的事情是从 services.YAML 文件中的排除中删除实体。

如果您通过注释为实体类的存储库设置名称,则通过运行此命令,您将生成存储库:

php bin\console make:entity --regenerate

您可以在上述命令生成的存储库文件中简单地编写复杂的查询。

要调用存储库类的方法,您可以在控制器文件中使用它:

$this->getDoctrine()->getRepository(EntityFile::class)->youFunctionNameInRepositoryFile()

请注意 getRepository 的参数,它是实体文件,而不是存储库文件。


推荐阅读