0
我試圖將我的Behat測試從Jenkins(構建服務器的每次運行)移到Docker,以便我可以將其添加到Travis。學說缺少「WHERE」子句
我遇到了一個小問題,其中WHERE
部分查詢未被Doctrine插入。該DQL輸出是這樣的:WHERE
和ORDER
之間
SELECT v FROM \Database\Entity\SoftwareVersion v WHERE ORDER BY v.versionMajor DESC, v.versionMinor DESC, v.versionPatch DESC, v.createdAt DESC
正如你所看到的,什麼都沒有。
查詢生成器的代碼如下所示:
/**
* Get the criteria array for versions
* @param SoftwareProduct $product Required. The product to check versions for
* @param SoftwareOperatingSystem $operatingSystem Required. The operating system you are using.
* @param string $version Optional. Approximate or exact version to check for. Eg 2.0 Might return 2.0.2
* @param string $order Should be ASC or DESC. Default: DESC
* @param int|null $limit How many results you want. Leave blank for all
* @return SoftwareVersion[]
* @throws Exception
*/
public function getVersions(
SoftwareProduct $product,
SoftwareOperatingSystem $operatingSystem = null,
$version = null,
$order = 'DESC',
$limit = null
) {
if ($order != 'DESC' && $order != 'ASC') {
throw new \DomainException("Invalid order '$order'");
}
$builder = $this->getEntityManager()
->createQueryBuilder();
$builder
->select('v')
->from('\Database\Entity\SoftwareVersion', 'v')
->andWhere('v.deletedAt IS NULL')
->andWhere($builder->expr()->lt('v.releaseDate', ':releaseDate'))
->setParameter('releaseDate', date('Y-m-d H:i:s'))
->andWhere($builder->expr()->eq('v.product', ':product'))
->setParameter('product', $product->getId())
;
// Anonymous function for simplified code
$equalIfExists = function ($key, $value) use ($builder) {
if ($value !== null) {
$builder
->andWhere($builder->expr()->eq("v.$key", ":$key"))
->setParameter($key, $value);
}
};
// OS
$equalIfExists('operatingSystem', $operatingSystem);
// Version Number
$versionObject = $this->stringToVersion($version);
$equalIfExists('versionMajor', $versionObject->getVersionMajor());
$equalIfExists('versionMinor', $versionObject->getVersionMinor());
$equalIfExists('versionPatch', $versionObject->getVersionPatch());
// Version Meta
$builder
->andWhere($builder->expr()->like("v.meta", ":meta"))
->setParameter('meta', $versionObject->getMeta() ? "{$versionObject->getMeta()}%" : '');
$builder
->addOrderBy('v.versionMajor', $order)
->addOrderBy('v.versionMinor', $order)
->addOrderBy('v.versionPatch', $order)
->addOrderBy('v.createdAt', $order);
$query = $builder->getQuery();
if ($limit) {
$query->setMaxResults($limit);
}
return $query->execute();
}
我知道,它看起來很複雜,但即使我們採取的第一個幾行:
$builder
->select('v')
->from('\Mischief\Database\Entity\SoftwareVersion', 'v')
->andWhere('v.deletedAt IS NULL')
它仍然無法正常工作。
更有趣的是:這段代碼是實時的,並按預期運行。我檢查過項目的依賴關係是一樣的。
我的PHP集裝箱泊塢窗文件是這樣的:
FROM php:7-fpm
RUN docker-php-ext-install pdo pdo_mysql mbstring
我看不到不在這裏住任何模塊。
那麼我的WHERE
在哪裏? :)
請問我是否可以提供更多信息。
我也試過這個。第一個' - > where()'工作,但是然後' - >和Where()'產生一個異常(一旦我有我的容器備份,我會讓你知道這個異常)。正如我所提到的,使用' - >和Where()'可以在現場正常工作。 – DanielM
道歉,不是例外,我得到這個代替: '29-Apr-2016 12:58:56]警告:[池www]子13退出信號11(SIGSEGV)後24.684632秒從開始' – DanielM