Symfony2 + Doctrine Association错误:类游戏没有名为home的关联

时间:2014-08-24 21:59:38

标签: php mysql symfony doctrine-orm doctrine

以下是MySQL表的列和行: enter image description here

我正在尝试使用Team.id内部加入game.home和game.away,但我收到错误:“错误:Class Travel \ Bundle \ TravelBundle \ Entity \ Game没有名为home的关联“我做错了什么?

这是我想要达到的预期结果,我知道如何在MySQL中实现,但不是Symfony和Doctrine:

select 
    t1.id as gameid, 
    t1.season as gameseason, 
    t1.gametype as gametype, 
        t2.id as homeid, 
        t2.name as homename, 
        t2.abbreviation as homeabbreviation, 
        t2.type as hometype, 
        t2.image as homeimage,
            t3.id as awayid, 
            t3.name as awayname, 
            t3.abbreviation as awayabbreviation, 
            t3.type as awaytype, 
            t3.image as awayimage from Game t1 
            INNER JOIN Team t2 on t1.home  = t2.id
            INNER JOIN Team t3 on t1.away  = t3.id;

以下是我的Doctrine实体:

Game.orm.yml:

Travel\Bundle\TravelBundle\Entity\Game:
    type: entity
     OneToOne:
        targetEntity: Travel\Bundle\TravelBundle\Entity\Team
    JoinColumn:
        name: home
        referencedColumnName: id
    repositoryClass: Travel\Bundle\TravelBundle\Entity\GameRepository
    fields:
        id:
            type: integer
            id: true
        generator:
            strategy: AUTO
        home:
            type: integer  
        away:
            type: integer
        season:
            type: string
        gametype:
        type: integer
        username:
        type: string
    lifecycleCallbacks: {  }

Team.orm.yml

Travel\Bundle\TravelBundle\Entity\Team:
    type: entity
    table: null
    repositoryClass: Travel\Bundle\TravelBundle\Entity\TeamRepository
    fields:
        id:
            type: integer
            id: true
            generator:
            strategy: AUTO
        name:
            type: string
            length: 255
        abbreviation:
            type: string
            length: 255
        type:
            type: string
            length: 255
        name:
            type: string
            length: 255
        image:
            type: string
            length: 255
        username:
            type: string
            length: 255
    lifecycleCallbacks:
        prePersist: [ uploadImage ]
        prePersist: [ preUpload ]
        preUpdate: [ preUpload ]
        postPersist: [ moveImage ]
        preRemove: [ removeImage ]

GameRepository.php

<?php

namespace Travel\Bundle\TravelBundle\Entity;

use Doctrine\ORM\EntityRepository;

/**
 * GameRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class GameRepository extends EntityRepository
{
    public function allByUsername($username)
    {
        $query = $this->getEntityManager()
        ->getRepository('TravelTravelBundle:Game')
        ->createQueryBuilder('t')
        ->select('t','g')
        ->innerJoin('t.home', 'g')
        ->setParameter('username', $username);
        $token = $query->getQuery()->getResult();
        return $token;
    }
}

?>

1 个答案:

答案 0 :(得分:0)

根据doctrine documentation,您的映射应如下所示:

<强> Game.orm.yml:

Travel\Bundle\TravelBundle\Entity\Game:
    type: entity
    repositoryClass: Travel\Bundle\TravelBundle\Entity\GameRepository
    oneToOne:
        home:
            targetEntity: Travel\Bundle\TravelBundle\Entity\Team
            joinColumn:
                name: home
                referencedColumnName: id
        away:
            targetEntity: Travel\Bundle\TravelBundle\Entity\Team
            joinColumn:
                name: away
                referencedColumnName: id