【问题标题】:Symfony2 Undefined method 'findLikeFullnameArray'. The method name must start with either findBy or findOneBySymfony2 未定义的方法“findLikeFullnameArray”。方法名称必须以 findBy 或 findOneBy 开头
【发布时间】:2015-08-07 15:53:00
【问题描述】:

我已阅读了有关此问题的各种解决方案,但似乎没有一个有效。我真的很想知道这个问题的核心是什么。我将准确列出我所做的,因为它相对简单,我无法理解我错过了什么。

所以我创建了一个带有表人的简单数据库,我正在尝试使用引导程序生成 CRUD,我可以正常工作。我的问题是当我尝试让 jquery 插件使用自动完成功能时。接下来我添加了一个存储库来处理我的查询,这就是我收到 Symfony2 Undefined method 'findLikeFullnameArray' 消息的时候。我正在尝试仅使用注释,所以如果我的过程中有问题,请告诉我。

这是我的命令: 创建捆绑包

  1. app/console 生成:bundle --bundle-name=CompanyNameofBundle --format=annotation
  2. Bundle 命名空间:Company/nameofBundle
  3. 是否要生成整个目录结构:是的
  4. 是否确认生成:返回
  5. 确认内核的自动更新:是
  6. 确认自动更新路由:是

使用 crud 创建实体

  1. app/console 生成:bundle --bundle-name=CompanyNameofBundle --format=annotation Bundle 命名空间:Company/nameofBundle 是否要生成整个目录结构:是 你确认代:return 确认内核的自动更新:是 确认路由的自动更新:是
  2. 应用程序/控制台原则:映射:import --force CompanyNameofBundle xml
  3. app/console 原则:generate:entities CompanyNameofBundle
  4. app/console generate:doctrine:crud –entity=CompanyNameofBundle:Entityname --format=annotation --with-write –no-interaction

然后我创建我的 SearchController:

namespace Company\NameofBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Company\NameofBundle\Form\JqueryType;
use Company\NameofBundle\Form\SearchType;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Company\NameofBundle\Entity\Person;


/**
 * Search controller.
 *
 * @Route("/search")
 */
class SearchController extends Controller
{
    /**
     * @Route("/", name="search")
     * @Template()
     */
    public function indexAction()
    {
        $form   = $this->createForm(new SearchType(), null, [
            'action' => '',
            'method' => 'POST'
        ]);
        return array(
            'form'   => $form->createView(),
        );
    }
    /**
     * @Route("/person_search", name="person_search")
     * @Template()
     *
     * @param Request $request
     *
     * @return array
     */
    public function searchPersonAction(Request $request)
    {
        $q = $request->get('term');
        $em = $this->getDoctrine()->getManager();
        $results = $em->getRepository('CompanyNameofBundle:Person')->findLikeFullname($q);
        return array('results' => $results);
    }

    /**
     * @Route("/person_get", name="person_get")
     *
     * @param $id
     *
     * @return Response
     */
    public function getPersonAction($id)
    {
        $em = $this->getDoctrine()->getManager();
        $book = $em->getRepository('CompanyNameofBundle:Person')->find($id);
        return new Response($book->getFullname());
    }
    /**
     * @Route("/jquery", name="jquery")
     * @Template()
     */
    public function jqueryAction()
    {
        $form   = $this->createForm(new JqueryType(), null, [
            'action' => '',
            'method' => 'POST'
        ]);
        return array(
            'form'   => $form->createView(),
        );
    }
    /**
     * @Route("/jquery_search/{phrase}", name="jquery_search")
     *
     * @param string $phrase
     *
     * @return JsonResponse
     */
    public function searchJqueryAction($phrase)
    {
        $em = $this->getDoctrine()->getManager();
        $results = $em->getRepository('CompanyNameofBundle:Person')->findLikeFullnameArray($phrase);
        return new JsonResponse($results);
    }
}

个人实体:

<?php

namespace Company\NameofBundle\Person;

use Doctrine\ORM\Mapping as ORM;

/**
 * Person
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Company\NameofBundle\Entity\Repository\PersonRepository")
 */
class Person

{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @var string
     *
     * @ORM\Column(name="fullname", type="string", length=255)
     */
    private $fullname;
    /**
     * @var string
     *
     * @ORM\Column(name="email", type="string", length=255)
     */
    private $email;
    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * Set fullname
     *
     * @param string $fullname
     * @return Person
     */
    public function setFullname($fullname)
    {
        $this->fullname = $fullname;
        return $this;
    }
    /**
     * Get fullname
     *
     * @return string
     */
    public function getFullname()
    {
        return $this->fullname;
    }
    /**
     * Set email
     *
     * @param string $email
     * @return Person
     */
    public function setEmail($email)
    {
        $this->email = $email;
        return $this;
    }
    /**
     * Get email
     *
     * @return string
     */
    public function getEmail()
    {
        return $this->email;
    }
}

最后是 PersonRepository

<?php

namespace Company\NameofBundle\Entity\Repository;
use Doctrine\ORM\EntityRepository;

class PersonRepository extends EntityRepository
{

    public function findLikeFullnameArray($fullname)
    {
        return $this->createQueryBuilder('person_repository')
            ->where('person_repository.fullname LIKE :name')
            ->setParameter('name', '%' . $fullname . '%')
            ->getQuery()
            ->getArrayResult();
    }
}

以防万一这是我的 app/config/routing.yml

company_nameofbundle:
    resource: "@CompanyNameofBundle/Controller/"
    type:     annotation
    prefix:   /

提前致谢!

【问题讨论】:

  • 您是否检查了所有命名空间和所有文件的路径?你清除缓存了吗?
  • 是的,我应该提到我也运行过:app/console cache:clear 和 app/console dictionary:cache:clear-metadata
  • 你也可以检查你之前没有生成过yml或者xml格式。
  • Sylvain 你能详细说明一下吗,因为我已经做了好几次了,所以我想确保我到处都检查过?
  • 好吧,这只是为了检查您是否放置了 xml 格式

标签: php symfony doctrine-orm


【解决方案1】:

第一次,您应该查看文档以拥有这样的存储库:

http://symfony.com/doc/current/book/doctrine.html

// src/AppBundle/Entity/Product.php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
 * @ORM\Entity(repositoryClass="AppBundle\Entity\ProductRepository")
 */
class Product
{
    //...
}

第二次,你必须检查你输入的xml格式的情况

&lt;entity name="Acme\StoreBundle\Entity\Product" repository-class="Acme\StoreBundle\Entity\ProductRepository"&gt;

您不能混合使用annotationxmlyml 格式来塑造 Symfony 2 中的实体,删除所有不必要的文件。

【讨论】:

    猜你喜欢
    • 2015-05-06
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多