代码之家  ›  专栏  ›  技术社区  ›  hanish singla

在symfony中选择特定列有用吗

  •  0
  • hanish singla  · 技术社区  · 7 年前

    我有点不确定在这里问这样的问题是否正确,因为这可能是一个编码标准而不是一个问题。

    我在一个团队中工作,与另一个成员就如何获取条令查询中的列进行了争论。他说,在获取记录时,我们应该按名称选择所有列,而我支持只获取完整的行和必需的列。

    我将展示代码版本的示例:

    我的版本:

    public function getRecord($fromDate, $toDate)
    {
        $query = $this->createQueryBuilder('table')
            ->andwhere('table.sendFrom <=:sendFrom')
            ->andwhere('table.sendTo >=:sendTo')
            ->setParameter('sendFrom', $fromDate)
            ->setParameter('sendTo', $toDate)
            ->getQuery();
    
        return $query->getResult();
    }
    

    他们的版本:

    public function getRecord($fromDate, $toDate)
    {
        // Sorry had to hide column names
        $query = $this->createQueryBuilder('table')
            ->select('table.id,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,'
                . 'table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,'
                . 'table.column_1,table.sendFrom,table.sendTo,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,'
                . 'table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,'
                . 'table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,'
                . 'table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,'
                . 'table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,'
                . 'table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,'
                . 'table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,'
                . 'table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.sendTo,'
                . 'table.sendFrom')
            ->andwhere('table.sendFrom <=:sendFrom')
            ->andwhere('table.sendTo >=:sendTo')
            ->setParameter('sendFrom', $fromDate)
            ->setParameter('sendTo', $toDate)
            ->getQuery();
    
        return $query->getResult();
    }
    

    虽然我发现我的版本更具未来的证据,就像我们在表中添加了一个新列一样,但我们不必在所有查询中添加新的列名,它们的论点是,它们的版本更安全、更快速。当我要求他们提供证据时,他们拒绝了。

    我想征求您对以下方面的意见:

    1. 我的论点是对还是错?
    2. 如果我是对的,那么我可以向团队提供什么证据/论据
    2 回复  |  直到 7 年前
        1
  •  0
  •   qdequippe    7 年前

    就性能而言,“他们的版本”是最好的,只有必要的字段才会被映射(但我认为增益可以忽略不计)。

    在维护方面,“我的版本”是最好的,如果您需要添加一个列,就必须将其添加到所有存储库中…

    在安全性方面,我认为这是一个没有争议的问题,工作不是在响应中公开敏感字段(HTML响应、JSON响应…)

    但这是我个人的看法。

        2
  •  0
  •   Magnesium    7 年前

    从数据库中选择数据总是要付出代价的。虽然在测试应用程序时它可能不会产生巨大的差异,但是当成千上万的用户同时查询您的数据库时,它是不同的。

    然而,代码质量和可维护性也是一个重要的因素,不一定总是为了获得0.00000%的性能而搞得一团糟。所以,如果您需要一行中的所有列,除了包含像int这样小的内容的列,我将使用整行。

    您可以做一些事情来提高代码的可读性和可重用性。我喜欢将我的存储库构造为一组小函数,它用一个可读的名称对数据库执行特定的操作,然后我可以在控制器中使用该名称:

    public function initQuery() 
    {
        $this->qb = $this->createQueryBuilder('table');
    
        return $this;
    }
    
    public function selectRows()
    {
        $this->qb->addSelect('table.row1, table.row2, table.row3...');
    
        return $this;
    }
    
    public function orderByDate() 
    {
        $this->qb->addOrderBy('table.date', 'ASC');
    
        return $this;
    }
    
    public function getResult()
    {
        return $this->qb
            ->getQuery()
            ->getResult()
        ;
    }
    

    然后我可以这样使用它:

    $rows = $repository
        ->initQuery()
        ->selectRows()
        ->orderByDate()
        ->getResult()
    ;