在symfony中选择特定的列是否有用

时间:2018-09-28 08:37:14

标签: symfony orm doctrine symfony4 doctrine-query

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

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

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

我的版本:

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 个答案:

答案 0 :(得分:0)

就性能而言,“他们的版本”是最好的,只会映射必要的字段(但我认为收益微不足道)。

在维护方面,“我的版本”是最好的,如果您需要添加列,那么必须在所有存储库中添加它是正确的...

就安全性而言,我认为这是不争的事实,其工作不是在响应(HTML响应,Json响应...)中公开敏感字段

但这是我个人的看法。

答案 1 :(得分:0)

从数据库中选择数据总是有代价的。虽然在测试您的应用程序时可能并没有太大的区别,但是当成千上万的用户同时查询数据库时,情况就不同了。

但是,代码质量和可维护性也是一个重要因素,仅获得0.00000%的性能并不总是那么麻烦。因此,如果您需要一行中的所有列,但其中包含像int这样的小列的列,则我会整行使用。

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

$wp_query

然后我可以像这样使用它:

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()
    ;
}