Php 加入一对多关系的Symfony原则

Php 加入一对多关系的Symfony原则,php,symfony,join,doctrine-orm,Php,Symfony,Join,Doctrine Orm,我想将两个表连接在一起,以便在一次搜索中检索所有实体。我有一对多的关系:绝地武士和成员。一个成员团体可以有许多绝地武士。我想制作一个表单,通过一个实体进行搜索,并将所有信息显示为一个整体 示例:按指定的颜色搜索绝地->检索姓名、年龄、性别、颜色和等级 Jedi.php: class Jedi { /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(st

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

示例:按指定的颜色搜索绝地->检索姓名、年龄、性别、颜色和等级

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:

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;
在my repository.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;
    }

 }
}

现在我很确定我可能把queryjoin语句搞错了,我对如何使用它感到非常困惑。任何帮助都将不胜感激

您的代码有错误。您的查询检索了许多行,但得到的却是单行(
getSingleResult()
)。正如您在文档中所看到的那样()
getSingleResult()
将在每次有许多行满足您的查询时抛出异常。 此外,如果需要实体的所有列,则不需要在查询中指定每个列。您可以只指定要检索的实体:

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

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

注意,在Select语句中,我使用了member和jedi。在这种情况下,条令将使用渴望连接(一个查询中的所有数据)。如果您只需要选择成员,并且其中一些成员检索到绝地,则可以在查询的选择部分忽略绝地。

首先,您应该将函数findEdibyColor移动到成员存储库,因为主表是Member而不是jedi

其次,您应该像下面的示例一样使用queryBuilder(在MemberRepository内部)。这将返回一个成员对象和绝地武士的阵列od。请注意,我使用“member_u”作为主要别名。不知何故,“member”不起作用(我现在不知道为什么)

如果您真的想对该查询使用DQL,它应该如下所示:

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

您不必创建具体的请求来执行类似的操作。 这可以简单地做到:

  • 在oneToMany实体定义中使用

    /**
     * @var integer
     * @ORM\OneToMany(targetEntity="Jedi", mappedBy="member",fetch="EAGER")
     *
     */
     protected $jedi;
    
  • 在绝地知识库中删除您的
    公共函数findEdibyColor($color){

  • 直接在控制器中使用存储库,如:

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

    或具有多个标准

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

  • 我承认我对教义不太熟悉,但如果表格是
    YodaBundle:Member
    ,绝地表格不是
    YodaBundle:Jedi
    ?@steven你是说这个问题?
    $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));