【问题标题】:Compare two database fields in extbase repository比较 extbase 存储库中的两个数据库字段
【发布时间】:2019-03-07 17:18:48
【问题描述】:
我正在使用 TYPO3 8。在我的扩展中,我有一个数据库表“company”,其中存储了每个公司的总位置数 (number_places) 和占用位置数 (occupied_places)。
现在我想将搜索限制在有空位的公司。
在 MySQL 中是这样的:
SELECT * FROM company WHERE number_places > occupied_places;
如何在 extbase 存储库中创建此查询?
我尝试在模型中引入虚拟属性placesLeft,但没有成功。
我不想使用下面提到的原始 SQL 语句,因为我已经实现了一个使用大量不同约束的过滤器。
Extbase query to compare two fields in same table
【问题讨论】:
标签:
repository
typo3
extbase
typo3-8.x
【解决方案1】:
您可以在您的存储库类中这样做,请注意代码中的 cmets:
class CompanyRepository extends \TYPO3\CMS\Extbase\Persistence\Repository
{
public function findWithAvailablePlaces(bool $returnRawQueryResult = false)
{
// Create a QueryBuilder instance
$queryBuilder = $this->objectManager->get(\TYPO3\CMS\Core\Database\ConnectionPool::class)
->getConnectionForTable('company')->createQueryBuilder();
// Create the query
$queryBuilder
->select('*')
->from('company')
->where(
// Note: this string concatenation is needed, because TYPO3's
// QueryBuilder always escapes the value in the ExpressionBuilder's
// methods (eq(), lt(), gt(), ...) and thus render it impossible to
// compare against an identifier.
$queryBuilder->quoteIdentifier('number_places')
. \TYPO3\CMS\Core\Database\Query\Expression\ExpressionBuilder::GT
. $queryBuilder->quoteIdentifier('occupied_places')
);
// Execute the query
$result = $queryBuilder->execute()->fetchAll();
// Note: this switch is not needed in fact. I just put it here, if you
// like to get the Company model objects instead of an array.
if ($returnRawQueryResult) {
$dataMapper = $this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper::class);
return $dataMapper->map($this->objectType, $result);
}
return $result;
}
}
注意事项:
class CompanyRepository extends \TYPO3\CMS\Extbase\Persistence\Repository
{
public function findWithAvailablePlaces(
int $limit = 10,
int $offset = 0,
bool $returnRawQueryResult = false
) {
// ...
$queryBuilder
->setMaxResults($limit)
->setFirstResult($offset);
$result = $queryBuilder->execute()->fetchAll();
// ...
}
}
【解决方案3】:
基于 TYPO3 的当前架构,数据结构是这样的:比较两个表,或者混合两个表的结果应该在 controller 中通过注入两个存储库来完成。 (可选)在例程的情况下,您可以构建一个域服务,该服务可以处理来自 action 本身的两个存储库中的数据。服务也必须注入。
注意:
如果您在表配置中定义了外部关系,则该外部关系的结果将显示在您定义的表存储库中。所以,还有那个。