如何在DQL中实现连接?

时间:2018-04-13 08:38:44

标签: mysql symfony join doctrine-orm

我需要在 Doctrine 中执行一个简单的查询(使用Symfony 3.3)。

我有"文章"包含描述的表格,以及"数据包" table,其中包含与Article的描述相对应的id。 在标准SQL中,这很容易

std::rel_ops::operator!=,>,<=,>=

如何在学说中这样做?我几乎尝试了一切,但没有任何工作!请帮忙

2 个答案:

答案 0 :(得分:0)

尝试使用教义魔法方法

在控制器中,类似于:

$em = $this->getDoctrine()->getManager();
$packets =  $em->getRepository('NameOfYourBundle:Packets')->findByArticles($id);

答案 1 :(得分:0)

来自Zend项目的代码,虽然我认为它与Symfony没什么不同。

在某个函数(例如Repository函数)中使用QueryBuilder:

// These use statements to indicate which to use in case of duplicate class names
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Query\Expr\Join;

$qb = $this->createQueryBuilder('p'); //"p" for packet
$qb->select('p.description', 'art.id')
    ->join(
    'p.article',         // "p" for Packet Entity. "article" for property on Packet Entity
    'art',               // "art" as short name for relation
    Join::WITH,          // Join type
    'art.id = :article'  // the param on which should the join occur
)
    ->setParameter('article', $article); // Set the param with an instance

$result =  $qb->getQuery()->getResult(); // Get the result

如果这是双向关系,您只需使用Doctrine提供的默认EntityRepository函数。

如:

$packets = $this->getObjectManager()->getRepository(Packet::class)->findBy(['article' => $article->getId()]);

如果在实体中正确设置,则更容易:

$packets = $article->getPackets();