【问题标题】:Get only few records depend on condition in collection of forms in Symony 2+在 Symony 2+ 中,仅根据条件收集少量记录
【发布时间】:2014-09-17 11:01:00
【问题描述】:

我有两张表说项目和项目分配。

如果我们创建项目对象的形式,我们也可以默认获得所有项目分配。

class projectType extends AbstractType {
......

->add('projectAllocation', 'collection',
                                array(
                                        'type' => new \ProjectBundle\Form\Type\projectAllocationType(),
                                        'allow_add' => true, 'allow_delete' => true,
                                        'prototype' => true,))

...

同样我们有projectAllocationType 表单。

现在在这种情况下,所有项目分配记录都将在表单中检索。

我们能不能有一些项目分配记录,满足一些条件,比如在某个日期之间等。

如果我们有很多收藏记录,基本上就像搜索和编辑一样

任何建议都将有助于实施。

已编辑

$qb=$repository->createQueryBuilder("p")
            //->from('Project', 'p')
            ->leftJoin('p.billingItems', 'b')
            ->leftJoin('b.invoice', 'inv')
            ->where('p.projectId = ?1')
            ->orderBy('p.name', 'ASC')
            ->setParameter(1, $projectId);



 if($invoice){
                $qb->andWhere('inv.invoiceId='.$invoice);
            // $queryString .= "and inv.invoiceId=".$invoice;
        }

$query->getSql() 查询是正确的。

SELECT p0_.project_id AS project_id0, p0_.name AS name1, b1_.billing_items_id
FROM project p0_
LEFT JOIN billing_items b1_ ON p0_.project_id = b1_.project_id
LEFT JOIN invoice i2_ ON b1_.invoice_id = i2_.invoice_id
WHERE p0_.project_id =171
AND i2_.invoice_id =3
ORDER BY p0_.name ASC
LIMIT 0 , 30

这里billing_items_id在直接对显示正确结果的数据库执行查询时手动添加。

Doctrine 查询project 对象包含所有计费项目。我只需要等于invoice 的项目。

【问题讨论】:

  • 查询您的项目,左加入您的分配,然后应用您的 where 条件,以便您只获得所需的分配。然后将项目传递给您的表单。表单本身没有任何过滤功能。
  • 好的...所以如果我们在将对象传递给表单之前进行查询?让我试试
  • [stackoverflow.com/questions/19868332/… 最好在 PHP (Symfony 2) 中传递完整的对象或只传递一个必需的值,建议完整的对象更好
  • 我认为您并不真正了解关系的运作方式。您发布的链接处理部分对象并且无关紧要。同样,您发布的查询表明对 Doctrine 2 的查询工具不熟悉。两次问同样的问题可能不会有太大帮助。考虑通过symfony.com/doc/current/book/doctrine.htmldocs.doctrine-project.org/projects/doctrine-orm/en/latest/… 特别注意加入您的关系。
  • 顺便说一句,没有什么特别的理由是您只需要使用一个表单来显示您的所有产品信息。例如,您可以创建一个仅显示分配项目的表单。

标签: forms symfony collections


【解决方案1】:

添加->select('p,b') 解决了我的问题。要考虑这两个实体数据,我们必须包含两个实体引用。

$qb=$repository->createQueryBuilder("p")
                ->select('p,b')
                ->leftJoin('p.billingItems', 'b')
                ->leftJoin('b.invoice', 'inv')
                ->where('p.projectId = ?1')
                ->orderBy('p.name', 'ASC')
                ->setParameter(1, $projectId);
    if($invoice){
         $qb->andWhere('inv.invoiceId='.$invoice);
    }

【讨论】:

    猜你喜欢
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 2021-09-23
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多