0

我正在使用一个简单的搜索功能,但问题是我通过 findByTitle 硬编码控制器中的类别标题值,然后将其传递给搜索功能。

Category 与 Post 实体具有 OneToMany/ManyToOne 关系。

已尝试以下但收到以下错误:Error: Call to a member function getTitle() on a non-object

$em = $this->getDoctrine()->getManager();

$query = $this->get('search');

$category = $em->getRepository('AcmeDemoBundle:Category')
    ->findAll();

$categoryTitle = $em->getRepository('AcmeDemoBundle:Category')
    ->findByTitle($category->getTitle());

$posts = $query->search($categoryTitle);

我怎样才能动态设置这个值,这样我就不必手动传递它了?

控制器

/**
 * Search action
 *
 * @return array
 *
 * @Route("/search", name="job1_search")
 * @Template("AcmeDemoBundle:Job1:search.html.twig")
 */
public function searchAction()
{
    // Search code: calling from the service Search
    $em = $this->getDoctrine()->getManager();

    $query = $this->get('search');

    $categoryTitle = $em->getRepository('AcmeDemoBundle:Category')
        ->findByTitle('job1');

    $posts = $query->search($categoryTitle);

    return array(
        'query' => $query,
        'posts' => $posts['results'],
    );
}

搜索服务

public function search($categoryTitle)
{
    $results = null;
    $query = $this->request->query->get('q');

    if (!empty($query)) {
        $em = $this->doctrine->getManager();

        $results = $em->createQueryBuilder()
            ->from('AcmeDemoBundle:Post', 'post')
            ->select('post')
            ->where('post.category = :category')
            ->setParameter('category', $categoryTitle)
            ->andWhere('post.title LIKE :search')
            ->addOrderBy('post.created', 'DESC')
            ->setParameter('search', "%${query}%")
            ->getQuery()
            ->getResult();
    }

    return array(
        'query'   => $query,
        'results' => $results,
    );
}
4

2 回答 2

0

好的,让我们从头开始:

$em = $this->getDoctrine()->getManager();

$query = $this->get('search');

// This will give an ArrayCollection of all AcmeDemoBundle:Category that you have
$category = $em->getRepository('AcmeDemoBundle:Category')
    ->findAll();

// In here $category is an array, so you cannot get it's title
// Also if you would have an actual entity set as $category - the $categorytitle would
// still be a AcmeDemoBundle:Category entity object, not a title string
$categoryTitle = $em->getRepository('AcmeDemoBundle:Category')
    ->findByTitle($category->getTitle());

$posts = $query->search($categoryTitle);

你有一个搜索查询字符串,所以我会这样做:

// This will contain the entity object
$category = $em->getRepository('AcmeDemoBundle:Category')->findByTitle($query);

要从中获得标题:

$categoryTitle = $category->getTitle();
于 2014-07-31T08:37:36.270 回答
0

findAll()无论您是否保留一个或多个实体,该方法都会发回一个数组

$category = $em->getRepository('AcmeDemoBundle:Category')
    ->findAll();

这意味着在以下几行中

$categoryTitle = $em->getRepository('AcmeDemoBundle:Category')
    ->findByTitle($category->getTitle())

您必须更改$category->getTitle()引发错误的方法,因为您调用的是数组本身的方法,而不是它包含的实体。

在不确切知道您要做什么的情况下很难提供更多详细信息(使用一个或多个类别,它是如何选择的,等等......)

于 2014-07-31T06:16:34.687 回答