2015-06-19 37 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! –