У меня возникла проблема с созданием SQL-запроса с помощью CreateQueryBuilder.INNER JOIN with Doctrine «createQueryBuilder» в SF2
У меня есть 2 таблицы:
- Таблица статьи с полями:
articleID (PK), tag, created, userID (FK)
- Таблица articlelocale с полями:
articlelocaleID (PK), articleID (FK), title, body, locale, translated
В моей articlelocale таблице у меня есть, что ссылки FK к моей статье.
Теперь я хотел бы выбрать статьи, начиная с таблицы статей, где locale == ... (from articlelocale table).
Это мое начало, но я не могу понять:
$a = $this->createQueryBuilder('a')
->select('a')
->innerJoin('a.articleid', 'ai', 'WITH', 'ai.articleid = :articleid')
->where('ai.locale = :locale')
->setParameter('locale', $locale)
->addOrderBy('a.created', 'DESC');
Чем больше я стараюсь, тем больше ошибок я получаю .... Что я делаю не так?
UPDATE:
Спасибо за помощь! Я добавил это в моей статье Entity:
/**
* @ORM\OneToMany(targetEntity="DX\MurisBundle\Entity\Articlelocale", mappedBy="articleid", cascade={"persist", "remove", "merge"}, orphanRemoval=true)
*/
protected $articlelocale;
/**
* Set articlelocale
*
* @param \DX\MurisBundle\Entity\Articlelocale $articlelocale
* @return Articlelocale
*/
public function setArticlelocale(\DX\MurisBundle\Entity\Articlelocale $articlelocale = null)
{
$this->articlelocale = $articlelocale;
return $this;
}
/**
* Get articlelocale
*
* @return \DX\MurisBundle\Entity\Articlelocale
*/
public function getArticlelocale()
{
return $this->articlelocale;
}
Это соотношение между Article<->ArticleLocale
в моем Articlelocale Entity:
/**
* @var \DX\MurisBundle\Entity\Article
*
* @ORM\ManyToOne(targetEntity="DX\MurisBundle\Entity\Article")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="articleID", referencedColumnName="articleID")
* })
*/
private $articleid;
Это запрос в моем ArticleRepository:
$a = $this->createQueryBuilder('a')
->select('a')
->innerJoin('a.articlelocale', 'ai')
->where('ai.locale = :locale')
->setParameter('locale', $locale)
->addOrderBy('a.created', 'DESC');
if (false === is_null($limit))
$a->setMaxResults($limit);
return $a->getQuery()
->getResult();
Я не получаю никаких ошибок, но когда я хочу просмотреть мои статьи и получить ArticleLocale следующим образом:
$articles = $em->getRepository('MurisBundle:Article')->getLatestArticles(null, $locale);
foreach($articles as $article)
{
dump($article->getArticlelocale()); die;
}
Результатом этого является PersistentCollection ...
Я хотел бы иметь реальный объект Articlelocale .. Что я делаю неправильно?
Это не большая проблема, но я также получаю NL и EN, но я фильтрую 'where locale == nl'. Но у меня все еще есть два результата.
В запросе вы должны использовать имя свойства, описанное в вашей организации, а не имя вашего поля. –
Имя моей собственности в моей организации - это статья. – nielsv
можете ли вы разместить код своего лица? – Matteo