Symfony Doctrine QueryBuilder出错

时间:2014-03-11 16:25:46

标签: symfony doctrine

我的存储库中有以下查询:

public function findHistoryForSub($snummer=1)
{
    $query = $this->createQueryBuilder( 'oh' )
        ->select( 'oh.id, oh.objektnummer, oh.idSubunternehmer, oh.datum, oh.typ, oh.outbox' )
        ->innerJoin( 'oh.objekt', 'o', 'WITH', 'o.objektnummer = oh.objektnummer AND o.idSubunternehmer = oh.idSubunternehmer' )
        ->innerJoin( 'oh.subunternehmer', 's', 'WITH', 's.subunternehmernummer = o.idSubunternehmer' )
        ->innerJoin( 's.subunternehmerUser', 'su', 'WITH', 'su.idSubunternehmer = s.subunternehmernummer' )
        ->where('su.idUser = :id')
        ->setParameter('id', $snummer);

    $querynew = $query->getQuery();

    /* This is the result, when I print $query->getQuery()->getDQL()
    SELECT oh.id, oh.objektnummer, oh.idSubunternehmer, oh.datum, oh.typ, oh.outbox
    FROM MBS\AllgemeinBundle\Entity\ObjektHistory oh
    INNER JOIN MBSAllgemeinBundle:Objekt o WITH o.objektnummer = oh.objektnummer AND o.idSubunternehmer = oh.idSubunternehmer
    INNER JOIN MBSAllgemeinBundle:Subunternehmer s WITH s.subunternehmernummer = o.idSubunternehmer
    INNER JOIN MBSAllgemeinBundle:SubunternehmerUser su WITH su.idSubunternehmer = s.subunternehmernummer
    WHERE su.idUser = :id
    */
    return $querynew->getResult();
}

在我的Controller中,我调用存储库

public function indexAction()
{
    $securityContext = $this->container->get( 'security.context' );
    if( $securityContext->isGranted( 'IS_AUTHENTICATED_FULLY' ) )
    {
        $em = $this->getDoctrine()->getManager();
        $objektHistoryRepo = $em->getRepository( 'MBSAllgemeinBundle:ObjektHistory' )
                                ->findHistoryForSub();

        return $this->render(
            'MBSAllgemeinBundle:Default:index.html.twig',
            array(
                "History" => $objektHistoryRepo
            )
        );
    }
    else
    {
        return $this->redirect($this->generateUrl('fos_user_security_login'));
    }
}

但是我收到了错误

[Semantical Error] line 0, col 17 near 'objektnummer,': 
Error: Invalid PathExpression. Must be a StateFieldPathExpression.

有人知道,我写错了哪一部分? 或者我的查询中有错误吗?

错误:类MBS \ AllgemeinBundle \ Entity \ ObjektHistory没有名为objekt的关联

但我必须在我的ObjektHistory Entitiy中执行此操作吗?

namespace MBS\AllgemeinBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * ObjektHistory
 */
class ObjektHistory
{
/**
 * @var \DateTime
 */
private $datum;

/**
 * @var boolean
 */
private $typ;

/**
 * @var boolean
 */
private $outbox;

/**
 * @var integer $uid
 *
 * @ORM\Column(name="id", type="integer", nullable=false)
 * @ORM\Id
 */
private $id;

/**
 * @var \MBS\AllgemeinBundle\Entity\Objekt
 */
private $idSubunternehmer;

/**
 * @var \MBS\AllgemeinBundle\Entity\Objekt
 */
private $objektnummer;


/**
 * Set datum
 *
 * @param \DateTime $datum
 * @return ObjektHistory
 */
public function setDatum($datum)
{
    $this->datum = $datum;

    return $this;
}

/**
 * Get datum
 *
 * @return \DateTime 
 */
public function getDatum()
{
    return $this->datum;
}

/**
 * Set typ
 *
 * @param boolean $typ
 * @return ObjektHistory
 */
public function setTyp($typ)
{
    $this->typ = $typ;

    return $this;
}

/**
 * Get typ
 *
 * @return boolean 
 */
public function getTyp()
{
    return $this->typ;
}

/**
 * Set outbox
 *
 * @param boolean $outbox
 * @return ObjektHistory
 */
public function setOutbox($outbox)
{
    $this->outbox = $outbox;

    return $this;
}

/**
 * Get outbox
 *
 * @return boolean 
 */
public function getOutbox()
{
    return $this->outbox;
}

/**
 * Get id
 *
 * @return integer 
 */
public function getId()
{
    return $this->id;
}

/**
 * Set idSubunternehmer
 *
 * @param \MBS\AllgemeinBundle\Entity\Objekt $idSubunternehmer
 * @return ObjektHistory
 */
public function setIdSubunternehmer(\MBS\AllgemeinBundle\Entity\Objekt $idSubunternehmer = null)
{
    $this->idSubunternehmer = $idSubunternehmer;

    return $this;
}

/**
 * Get idSubunternehmer
 *
 * @return \MBS\AllgemeinBundle\Entity\Objekt 
 */
public function getIdSubunternehmer()
{
    return $this->idSubunternehmer;
}

/**
 * Set objektnummer
 *
 * @param \MBS\AllgemeinBundle\Entity\Objekt $objektnummer
 * @return ObjektHistory
 */
public function setObjektnummer(\MBS\AllgemeinBundle\Entity\Objekt $objektnummer = null)
{
    $this->objektnummer = $objektnummer;

    return $this;
}

/**
 * Get objektnummer
 *
 * @return \MBS\AllgemeinBundle\Entity\Objekt 
 */
public function getObjektnummer()
{
    return $this->objektnummer;
}
}

1 个答案:

答案 0 :(得分:1)

我认为你应该做这样的事情

->innerJoin( 'oh.object', 'o', 'WITH', 'o.objektnummer = oh.objektnummer AND o.idSubunternehmer = oh.idSubunternehmer' )
->innerJoin( 'oh.subunternehmer', 's', 'WITH', 's.subunternehmernummer = o.idSubunternehmer' )
->innerJoin( 's.subunternehmerUser', 'su', 'WITH', 'su.idSubunternehmer = s.subunternehmernummer' )

此外,您应该确保定义了所有实体关联