2015-06-19 38 views
0

我一直在DQL中进行多重连接。 这里是我的代码:Doctrine&Symfony2加入多个表格

$query = $em->createQuery(
     'SELECT k 
     FROM AppBundle:Keyword k 
     JOIN k.company c 
     JOIN k.entry e 
     WHERE c.user = :id 
     ORDER BY k.name ASC' 
    )->setParameter('id',$user_id); 

但它给了我“注意:输入:未定义指数”执行它时。

这里是我的关键字实体:

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* Keyword 
*/ 
class Keyword 
{ 
/** 
* @var integer 
*/ 
private $id; 

/** 
* @var string 
*/ 
private $name; 


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

/** 
* Set name 
* 
* @param string $name 
* @return Keyword 
*/ 
public function setName($name) 
{ 
    $this->name = $name; 

    return $this; 
} 

/** 
* Get name 
* 
* @return string 
*/ 
public function getName() 
{ 
    return $this->name; 
} 
/** 
* @var \Doctrine\Common\Collections\Collection 
*/ 
private $user; 

/** 
* Constructor 
*/ 
public function __construct() 
{ 
    $this->user = new \Doctrine\Common\Collections\ArrayCollection(); 
} 

/** 
* Add user 
* 
* @param \AppBundle\Entity\User $user 
* @return Keyword 
*/ 
public function addUser(\AppBundle\Entity\User $user) 
{ 
    $this->user[] = $user; 

    return $this; 
} 

/** 
* Remove user 
* 
* @param \AppBundle\Entity\User $user 
*/ 
public function removeUser(\AppBundle\Entity\User $user) 
{ 
    $this->user->removeElement($user); 
} 

/** 
* Get user 
* 
* @return \Doctrine\Common\Collections\Collection 
*/ 
public function getUser() 
{ 
    return $this->user; 
} 

/** 
* Set user 
* 
* @param \AppBundle\Entity\User $user 
* @return Keyword 
*/ 
public function setUser(\AppBundle\Entity\User $user = null) 
{ 
    $this->user = $user; 

    return $this; 
} 
/** 
* @var \Doctrine\Common\Collections\Collection 
*/ 
private $company; 


/** 
* Add company 
* 
* @param \AppBundle\Entity\Company $company 
* @return Keyword 
*/ 
public function addCompany(\AppBundle\Entity\Company $company) 
{ 
    $this->company[] = $company; 

    return $this; 
} 

/** 
* Remove company 
* 
* @param \AppBundle\Entity\Company $company 
*/ 
public function removeCompany(\AppBundle\Entity\Company $company) 
{ 
    $this->company->removeElement($company); 
} 

/** 
* Get company 
* 
* @return \Doctrine\Common\Collections\Collection 
*/ 
public function getCompany() 
{ 
    return $this->company; 
} 

/** 
* Set company 
* 
* @param \AppBundle\Entity\Company $company 
* @return Keyword 
*/ 
public function setCompany(\AppBundle\Entity\Company $company = null) 
{ 
    $this->company = $company; 

    return $this; 
} 
/** 
* @var \Doctrine\Common\Collections\Collection 
*/ 
private $entry; 


/** 
* Add entry 
* 
* @param \AppBundle\Entity\Entry $entry 
* @return Keyword 
*/ 
public function addEntry(\AppBundle\Entity\Entry $entry) 
{ 
    $this->entry[] = $entry; 

    return $this; 
} 

/** 
* Remove entry 
* 
* @param \AppBundle\Entity\Entry $entry 
*/ 
public function removeEntry(\AppBundle\Entity\Entry $entry) 
{ 
    $this->entry->removeElement($entry); 
} 

/** 
* Get entry 
* 
* @return \Doctrine\Common\Collections\Collection 
*/ 
public function getEntry() 
{ 
    return $this->entry; 
} 
/** 
* @var \Doctrine\Common\Collections\Collection 
*/ 
private $ranking; 


/** 
* Add ranking 
* 
* @param \AppBundle\Entity\Ranking $ranking 
* @return Keyword 
*/ 
public function addRanking(\AppBundle\Entity\Ranking $ranking) 
{ 
    $this->ranking[] = $ranking; 

    return $this; 
} 

/** 
* Remove ranking 
* 
* @param \AppBundle\Entity\Ranking $ranking 
*/ 
public function removeRanking(\AppBundle\Entity\Ranking $ranking) 
{ 
    $this->ranking->removeElement($ranking); 
} 

/** 
* Get ranking 
* 
* @return \Doctrine\Common\Collections\Collection 
*/ 
public function getRanking() 
{ 
    return $this->ranking; 
} 
} 

我的接入实体:

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* Entry 
*/ 
class Entry 
{ 
/** 
* @var integer 
*/ 
private $id; 

/** 
* @var string 
*/ 
private $path; 


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

/** 
* Set path 
* 
* @param string $path 
* @return Entry 
*/ 
public function setPath($path) 
{ 
    $this->path = $path; 

    return $this; 
} 

/** 
* Get path 
* 
* @return string 
*/ 
public function getPath() 
{ 
    return $this->path; 
} 

/** 
* @var \AppBundle\Entity\Keyword 
*/ 
private $keyword; 


/** 
* Set keyword 
* 
* @param \AppBundle\Entity\Keyword $keyword 
* @return Entry 
*/ 
public function setKeyword(\AppBundle\Entity\Keyword $keyword = null) 
{ 
    $this->keyword = $keyword; 

    return $this; 
} 

/** 
* Get keyword 
* 
* @return \AppBundle\Entity\Keyword 
*/ 
public function getKeyword() 
{ 
    return $this->keyword; 
} 
/** 
* @var \Doctrine\Common\Collections\Collection 
*/ 
private $ranking; 

/** 
* Constructor 
*/ 
public function __construct() 
{ 
    $this->ranking = new \Doctrine\Common\Collections\ArrayCollection(); 
} 

/** 
* Add ranking 
* 
* @param \AppBundle\Entity\Ranking $ranking 
* @return Entry 
*/ 
public function addRanking(\AppBundle\Entity\Ranking $ranking) 
{ 
    $this->ranking[] = $ranking; 

    return $this; 
} 

/** 
* Remove ranking 
* 
* @param \AppBundle\Entity\Ranking $ranking 
*/ 
public function removeRanking(\AppBundle\Entity\Ranking $ranking) 
{ 
    $this->ranking->removeElement($ranking); 
} 

/** 
* Get ranking 
* 
* @return \Doctrine\Common\Collections\Collection 
*/ 
public function getRanking() 
{ 
    return $this->ranking; 
} 
} 

顺便说一句,我与Symfony和学说很新。 我感谢各种帮助!

回答

1

您需要为模型类中的每个属性提供映射信息,并提供该类的实体映射。看一看http://doctrine-common.readthedocs.org/en/latest/reference/annotations.html

你的每个模型类都需要@ORM \ Entity注解来告诉它是一个映射实体的教条。因此,对于你的情况,你将有:

/** 
* Entry 
* @ORM\Entity 
*/ 
class Entry 
{ 
... 

然后每个属性要数据库需要一个@ORM \列注释映射。例如:

/** 
* @var integer 
* @ORM\Id @ORM\Column @ORM\GeneratedValue 
*/ 
private $id; 

/** 
* @var string 
* @ORM\Column(type="string") 
*/ 
private $path; 

然后你需要为你的模型之间的关系,关系映射注解(关键字 - >公司,关键字 - >输入等),使用映射的一个在这里http://doctrine-orm.readthedocs.org/en/latest/reference/association-mapping.html

一旦你有所有正确的映射使用命令行工具app/console doctrine:schema:update来确保你的模型与你的数据库同步。

你的DQL看起来很好,所以一旦你有正确的映射,你可能会有更好的运气。

+0

好的dk80,我会试一试 - 谢谢! –

+0

好吧,我明白了!谢谢dk80! –