Symfony2的学说加盟(symfony2 doctrine join)

2019-09-16 07:57发布

好了,我已经得到了我研究并研究如何得到这个工作和我的生活查询我不能!......也许我只是在做这个错误和最少的信息香港专业教育学院发现..

我有一个表名叫时钟进度设置..其中有一个领域:它noteBy_id这是一个ID,记录属于用户...

我现在要做的,是在系统的东西在管理方面。我预计超过100家公司使用该时钟进度系统,因此我需要根据公司ID来筛选结果。在用户表,我有一个字段中指定parentcompany_id

所以,让我们看看我能不能用言语什么,我需要做的表达..

我需要从时钟进度*和左的连接user.parentcompany_id其中timeclock.daydate <:启动并在u.parentcompany =:PID

其中开始是:`日期( 'YMD 00:00:00');

我设置此查询:

$em = $this->getDoctrine()->getEntityManager();
$start = date('Y-m-d 00:00:00');
$qb = $em->getRepository('EcsCrmBundle:TimeClock');
$qb = $qb->createQueryBuilder('t');

$query = $qb->select('t, u.parentcompany_id')
->from('timeclock', 't')
->leftJoin('Ecs\AgentManagerBundle\Entity\User', 'u', 'ON' 'u.id = t.noteBy_id AND u.parentcompany_id = :pid')
->where('t.daydate < :start')
->andWhere("t.noteBy_id != ''")
->setParameter('start', $start)
->setParameter('pid', $user->getParentcompany())
->getQuery();

$entities = $query->getArrayResult();

我看着看着,不能找到一个解决方案,我得到的是错误:

An exception has been thrown during the rendering of a template ("[Semantical Error] line 0, col 112 near 'u ON u.id = t.noteBy_id': Error: Identification Variable Ecs\AgentManagerBundle\Entity\User used in join path expression but was not defined before.") in EcsCrmBundle:TimeClock:manager.html.twig at line 5.

并且获取输出的查询是:

SELECT t, u.parentcompany_id FROM Ecs\CrmBundle\Entity\TimeClock t LEFT JOIN Ecs\AgentManagerBundle\Entity\User u ON u.id = t.noteBy_id AND u.parentcompany_id = :pid, timeclock t LEFT JOIN Ecs\AgentManagerBundle\Entity\User u ON u.id = t.noteBy_id AND u.parentcompany_id = :pid WHERE t.daydate < :start AND t.noteBy_id != ''

在正常情况下将工作完美......但在这一点,它只是不...任何想法?

Answer 1:

我最近不得不做这样的..我猜这个,你noteBy是在用户表中的多对一和你是想拥有它由管理员的公司,是当前登录到筛选结果您系统..

所以,适配加入我只好自己写这样的任务是很容易的。 我个人喜欢用的QueryBuilder因此这将查询生成器来完成..

在查询你的第一个错误是->from('timeclock', 't')线。 因为您以前使用创建你的对象$qb = $em->getRepository('EcsCrmBundle:TimeClock'); $qb = $qb->createQueryBuilder('t'); $qb = $em->getRepository('EcsCrmBundle:TimeClock'); $qb = $qb->createQueryBuilder('t'); 你不需要from查询生成器,因为它会为你生成。

接下来的问题,是leftJoin我会解释为什么当我展示了一个工作版本。

而最后一个问题,防止这种工作你想要的-是缺少andWhere条款。 所以,让我们来看看一个工作查询。

$query = $qb->select('t, u')
     ->leftJoin('t.noteBy', 'u', 'WITH', 'u.id = t.noteBy')
     ->where('t.daydate < :start')
     ->andWhere('u.parentcompany = :pid')
     ->setParameter('start', $start)
     ->setParameter('pid', $user->getParentcompany()) 
     ->getQuery();

所以,因为我们已经通过使用创建的对象$qb = $qb->createQueryBuilder('t')我们只需选择tu

对于加盟,我们正在通过连接时钟进度表noteBy列,这是从用户表中的用户ID。 所以,第一个参数是“从”的别名。 所以,既然我们已经别名时钟进度表,难道我们使用t.noteBy 。 在leftjoin下一个参数是第二台,这是别名u在这种情况下,但可以是任何东西。对于一个leftJoin第三个参数而言-是你加入的方式..无论是WITHON将在这里工作。 和第四个参数,是希望它有比赛。在这种情况下u.id must equal t.noteBy

你会看到,我摆脱了之一andWhere ,我这样做是因为你不应该需要它的正常结构化查询。 我在没有添加然而andWhereu.parentcompany因为这是你正在寻找,以滤除你应该有它在WHERE,而不是作为加入本身就是一个比赛毕竟是什么。

该文档在这个非常有限的,我花了一段时间来弄清楚这一切以及..你,无疑是 - 像我一样,来使用教义从手工编写查询。 所以因为你似乎与Symfony的被刚刚开始(我是我自己,以及约2个月现在),你仍然在手工编码的心态。 但随着进一步的时候,你会开始了解生命的DQL方式。 试试这个查询,看看会发生什么。



Answer 2:

好吧,首先你需要涉及实体TimeclockCompany 。 每当你想加入两个实体Doctrine ,他们需要通过一些属性相关(即表列)。

我看不出有任何需要User在此查询实体的所有信息,可通过Company实体,你是不是基于任何用户属性过滤下来的结果。

你所需的查询应该是这个样子(或多或少)。 我把自由和抛弃_id后缀从实体属性,因为它们会使人究竟怎么回事。 ;)

$query = $this->getEntityManager()->createQuery("SELECT t, c.id FROM EcsCrmBundle:TimeClock t JOIN t.company c WHERE c.id = :pid AND t.daydate < :start AND t.noteBy != ''");

$query->setParameter('start', $start);
$query->setParameter('pid', $user->getParentcompany());
return $query->getArrayResult();

另外,我做inner-joinJOIN ),因为我认为不可能有时钟进度没有这家公司,但随时更改到LEFT JOIN如果适合你更好。

难道这就是你想达到什么目的?



文章来源: symfony2 doctrine join