我不确定在这里问这样的问题是否正确,因为这可能是编码标准,而不是问题。
我在一个团队中工作,与另一位成员就如何获取学说查询中的列进行了争论。他说,在获取记录时,我们应该按名称选择所有列,而我赞成仅获取完整的行和必填的列。
我将展示我们的代码版本的示例:
我的版本:
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();
}
虽然我发现我的版本更具前瞻性,就像我们在表中添加新列一样,但我们不必在所有查询中都添加新列名,他们的观点是它们的版本更安全,更快速。当我要求他们提供证据时,他们拒绝了。
我正在寻找您的意见:
答案 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()
;
}