我正在学习symfony,我想要一个搜索栏来向用户显示电子邮件。但是我得到了错误
Attempted to call an undefined method named "getEntityManager" of class "App\Repository\SearchRepository".
如果有人可以帮助我或向我解释如何做,那将是非常好的。谢谢
在SearchRepository中
class SearchRepository
{
public function findAllWithSearch($email){
$entityManager = $this->getEntityManager();
$query = $entityManager->createQuery(
'SELECT u
FROM App\Entity\User u
WHERE u.email :email'
)->setParameter('email', $email);
return $query->execute();
}
}
在SearchController中
class SearchController extends AbstractController
{
/**
* @Route("/admin/search/", name="admin_search")
* @Security("is_granted('ROLE_ADMIN')")
*/
public function searchUser(SearchRepository $repository, Request $request)
{
$q = $request->query->get('search');
$comments = $repository->findllWithSearch($q);
return $this->render('admin/search/search.html.twig',
[ 'user' => $repository,
]);
}
}
和search.twig.html
<form action="" method="get">
<input type="search" name="search" value="" placeholder="Recherche.." />
<input type="submit" value="Valider" />
</form>
答案 0 :(得分:3)
快速解答
SearchRepository需要扩展\ Doctrine \ Bundle \ DoctrineBundle \ Repository \ ServiceEntityRepository。
<?php
namespace App\Repository;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
class SearchRepository extends ServiceEntityRepository
public function findAllWithSearch($email)
{
$entityManager = $this->getEntityManager();
$query = $entityManager->createQuery(
'SELECT u
FROM App\Entity\User u
WHERE u.email :email'
)->setParameter('email', $email);
return $query->execute();
}
修复应用程序的体系结构
好像您正处于旅程的开始。上面的代码可以解决您的问题,但是您需要注意代码的体系结构。
使用您的特定示例,您可以使用
$repoInstance->findByEmail($email);
在您的控制器内,这将返回所有记录实体 匹配您的电子邮件地址。
有关使用主义知识库的更多信息
有关此存储库如何工作的更多信息,请使用此链接中的文档进行使用并进行试验: https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/working-with-objects.html
答案 1 :(得分:2)
从原则文档中:
存储库对象提供了多种方法来检索 指定的类型。默认情况下,存储库实例的类型为
Doctrine\ORM\EntityRepository
。您还可以使用自定义存储库 课程。
因此,如果您的搜索要处理User
个对象,则可以通过在UserRepository
中执行以下操作来使用标准的Controller
:
/**
* @Route("/admin/search/", name="admin_search")
* @Security("is_granted('ROLE_ADMIN')")
*/
public function searchUser(Request $request)
{
$q = $request->query->get('search');
// Get standard repository
$user = $this->getDoctrine()->getManager()
->getRepository(User::class)
->findBy(['email' => $q]); // Or use the magic method ->findByEmail($q);
// Present your results
return $this->render('admin/search/search_results.html.twig',
['user' => $user]);
}
您的用例不需要自定义存储库,但是如果您要创建一个自定义存储库并用于自动装配,则必须扩展ServiceEntityRepository
,这是Symfony提供的容器友好型基础存储库类。您可以在the documentation中获得更多详细信息。在这种情况下,您可能还想查看how to annotate your entity来告诉EntityManager
您将使用自定义存储库。
旁注:默认情况下,action
的{{1}}属性默认为您要访问的路线,因此,如果该片段是布局的一部分,则必须将其明确设置为您的form
动作:SearchController
答案 2 :(得分:1)
如果timestamp_filter = Q()
if from_timestamp:
timestamp_filter |= Q(
**{f"{MESSAGEMODEL_ATTRIBUTE_NAME_IN_DEVICEMODEL}__{TIMESTAMP_FIELD_NAME}__gte": from_timestamp}
)
if to_timestamp:
timestamp_filter |= Q(
**{f"{MESSAGEMODEL_ATTRIBUTE_NAME_IN_DEVICEMODEL}__{TIMESTAMP_FIELD_NAME}__lte": to_timestamp}
)
已经存在并扩展了UserRepository
,请尝试将ServiceEntityRepository
移至findAllWithSearch
。
如果不是,那么您的SearchRepository必须看起来像这样
UserRepository