dongya2029 2017-01-19 10:57
浏览 47

Symfony - 查找具有多对多关系的实体对象

I'm making a form that searches users by three parameters:

-Category -Subcategories (multiple choice) -Province

The user entity has a relation manyToOne with Categories, and ManyToMany with the other parameters. If I want to find only by categorie, I suppose that I have to use this code:

$users = $em->getRepository('CASUsuariosBundle:Artist')->findByCategory($category);

But how can I do it with the other parameters? Especially with subcategories, which is a multiple selection.

User entity:

/**
 * @ORM\ManyToOne(targetEntity="\CAS\EventBundle\Entity\Category", inversedBy="artists")
 * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
*/
private $category;

/**
 * @ORM\ManyToMany(targetEntity="\CAS\EventBundle\Entity\Subcategory", inversedBy="artists")
 * @ORM\JoinTable(name="artists_subcategories",
 *      joinColumns={@ORM\JoinColumn(name="artist_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="subcategory_id", referencedColumnName="id")}
 *      )
*/
private $subcategories;

/**
 * @ORM\ManyToMany(targetEntity="\CAS\EventBundle\Entity\Province", inversedBy="artists")
 * @ORM\JoinTable(name="artists_provinces",
 *      joinColumns={@ORM\JoinColumn(name="artist_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="province_id", referencedColumnName="id")}
 *      )
 */
 protected $provinces;

SearchController:

public function searchAction(Request $request) {
    $search = new Search();
    $em = $this->getDoctrine()->getManager();
    $form = $this->createForm(new SearchType($this->getDoctrine()->getManager()), $search);
    $form->setData($search);

    $form->handleRequest($request);

    if ($form->isValid() || $form->isSubmitted()) {
        $category = $form->get('category')->getData();
        $subcategories = $form->get('subcategories')->getData();
        $province = $form->get('province')->getData();

        return $this->showAction($category, $subcategories, $province);
    }

    return $this->render('CASUsuariosBundle:Profile:search.html.twig', array(
        'form' => $form->createView()
    ));
}

public function showAction($category, $subcategories, $province) {
    return $this->render('CASUsuariosBundle:Profile:search_results.html.twig');
}
  • 写回答

1条回答 默认 最新

  • dongqiao1151 2017-01-19 11:25
    关注

    You should be able to do

    $users = $em->getRepository('CASUsuariosBundle:Artist')->findBy([
        'category' => $categories,
        'province' => $province,
        //...
    ]);
    

    If you want even more control you can always create a QueryBuilder which will allow you to forge your own doctrine request:

    From the symfony docs:

    $em = $this->getDoctrine()->getManager();
    $query = $em->createQuery(
        'SELECT p
        FROM AppBundle:Product p
        WHERE p.price > :price
        ORDER BY p.price ASC'
    )->setParameter('price', 19.99);
    
    $products = $query->getResult();
    

    For reference: http://symfony.com/doc/current/doctrine.html#querying-for-objects-with-dql http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/query-builder.html

    评论

报告相同问题?

悬赏问题

  • ¥15 Oracle中如何从clob类型截取特定字符串后面的字符
  • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
  • ¥15 如何在炒股软件中,爬到我想看的日k线
  • ¥15 seatunnel 怎么配置Elasticsearch
  • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
  • ¥15 (标签-MATLAB|关键词-多址)
  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端
  • ¥15 基于PLC的三轴机械手程序
  • ¥15 多址通信方式的抗噪声性能和系统容量对比