在symfony 4中如何以及在何处执行自定义查询

在symfony 4中如何以及在何处执行自定义查询,symfony,doctrine-orm,symfony4,Symfony,Doctrine Orm,Symfony4,我使用的实体类扩展了ServiceEntityRepository,如下所示: class Sms extends ServiceEntityRepository { public function __construct(ManagerRegistry $registry) { parent::__construct($registry, Sms::class); } ... } 因此,当我需要在控制器文件中持久化实体类的实例时,我需要传递ManagerR

我使用的实体类扩展了ServiceEntityRepository,如下所示:

class Sms extends ServiceEntityRepository
{ 
   public function __construct(ManagerRegistry $registry)
   {
       parent::__construct($registry, Sms::class);
   }
... 
}
因此,当我需要在控制器文件中持久化实体类的实例时,我需要传递ManagerRegistry作为实体类的参数,但我找不到访问控制器中的
ManagerRegistry


有人能帮忙吗?

问题是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的参数,它是实体文件,而不是存储库文件。

服务可能是私有的,因此您无法使用
$this->container->get(ManagerRegistry::class)
从容器中获取它。只需将
ManagerRegistry
注入控制器或覆盖服务定义并将其公开。让条令实体扩展存储库将非常奇怪。条令中没有活动记录。所以你的方法根本上是错误的。至于您的问题,您发布的代码展示了如何将注册表注入到类中。无论如何,你不需要这样做。我没有完全理解a)为什么你的实体要扩展ServiceEntityRepository(这意味着要通过存储库类而不是实体来扩展)和b)为什么你需要控制器中的ManagerRegistry来保存实体实例?我扩展它是因为我在寻找“查询生成器”在我的实体类中,@Cerad和@ejuhjav-Guys relax
ServiceEntityRepository
只是一个
可选的EntityRepository基类,带有一个简化的构造函数(用于自动连接)。
。我没有看到任何不好的做法扩展它-因为它是注定的。类名
Sms
可能表示“不好”的方法,但不一定来自问题中的代码。将类名更改为
SmsRepository
可能更明显,同意:)