Symfony主义加入一对多关系 [英] Symfony Doctrine joining a one to many relationship

查看:87
本文介绍了Symfony主义加入一对多关系的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想将两个表连接在一起,以便一次搜索即可检索所有实体.我有一对多的关系:绝地和成员.一个成员组可以有许多绝地武士.我想制作一个表单以按一个实体进行搜索,并整体显示所有信息.

I want to join two tables together to get retrieve all the entities in one search. I have a one to many relationship: Jedi and Member. One member group can have many Jedi's. I want to make a form to search by one entity and displays all of the information as a whole.

示例:按指定的颜色搜索Jedi->检索姓名,年龄,性别,颜色和等级.

Example: Search for a Jedi by its assigned color -> retrieving name, age, gender, color, and rank.

Jedi.php:

class Jedi
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="name", type="string", length=255)
 */
private $name;

/**
 * @var integer
 *
 * @ORM\Column(name="age", type="integer")
 */
private $age;

/**
 * @var string
 *
 * @ORM\Column(name="gender", type="string", length=255)
 */
private $gender;

/**
 *
 * @ORM\ManyToOne(targetEntity="Member", inversedBy="jedi")
 * @ORM\JoinColumn(name="member", referencedColumnName="id")
 */
private $member;

Member.php:

Member.php:

class Member
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="rank", type="string", length=255)
 */
private $rank;

/**
 * @var string
 *
 * @ORM\Column(name="color", type="string", length=255)
 */
private $color;

/**
 * @var integer
 * @ORM\OneToMany(targetEntity="Jedi", mappedBy="member")
 *
 */
protected $jedi;

在我的JediRepository.php中:

In my JediRepository.php:

class JediRepository extends EntityRepository
{

public function findJediByColor($color) {

    $query = $this->getEntityManager()
        ->createQuery(
            'SELECT color, rank
             FROM YodaBundle:Member member
             JOIN member.jedi 
             WHERE member.color = :color'
        )->setParameter('color', $color);

    try {
        return $query->getSingleResult();
    } catch (\Doctrine\ORM\NoResultException $e) {
        return null;
    }

 }
}

现在,我非常确定我可能有错误的查询联接语句,并且我对如何继续使用它感到很困惑.任何帮助将不胜感激!

Now I am pretty sure I probably have the query join statement all wrong and I'm quite confused on how to to go about using it. Any help would be appreciated!

推荐答案

您不必创建特定请求即可执行此类操作. 可以简单地完成:

You have not to create specifics requests to do things like this. It could be done simply :

  1. 使用

  1. Using Eager loading in your oneToMany entity definition.

/**
 * @var integer
 * @ORM\OneToMany(targetEntity="Jedi", mappedBy="member",fetch="EAGER")
 *
 */
 protected $jedi;

  • 在Jedi存储库中删除您的public function findJediByColor($color) {

    使用魔术函数直接在您的控制器中存储库,例如:

    Using magic function repository in your controller directly like :

    $this->getDoctrine()
    ->getRepository('YourBundle:Member')
    ->findByColour($colour);
    

    $this->getDoctrine()
    ->getRepository('YourBundle:Member')
    ->findByRank($rank);
    

    $this->getDoctrine()
    ->getRepository('YourBundle:Member')
    ->findByJedi($jedi);
    

    或具有多个条件

    $this->getDoctrine()
    ->getRepository('YourBundle:Member')
    ->findBy(array('colour' => $colour, 'rank' => $rank));
    

  • 这篇关于Symfony主义加入一对多关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆