2016-04-29 94 views
0

我試圖將我的Behat測試從Jenkins(構建服務器的每次運行)移到Docker,以便我可以將其添加到Travis。學說缺少「WHERE」子句

我遇到了一個小問題,其中WHERE部分查詢未被Doctrine插入。該DQL輸出是這樣的:WHEREORDER之間

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在哪裏? :)

請問我是否可以提供更多信息。

回答

0
$builder 
    ->select('v') 
    ->from('\Database\Entity\SoftwareVersion', 'v') 
    ->where('v.deletedAt IS NULL') 
    ->andwhere($builder->expr()->lt('v.releaseDate', ':releaseDate')) 
    ->andwhere($builder->expr()->eq('v.product', ':product')) 
    ->setParameter('releaseDate', date('Y-m-d H:i:s')) 
    ->setParameter('product', $product->getId()) 
    ; 
+0

我也試過這個。第一個' - > where()'工作,但是然後' - >和Where()'產生一個異常(一旦我有我的容器備份,我會讓你知道這個異常)。正如我所提到的,使用' - >和Where()'可以在現場正常工作。 – DanielM

+0

道歉,不是例外,我得到這個代替: '29-Apr-2016 12:58:56]警告:[池www]子13退出信號11(SIGSEGV)後24.684632秒從開始' – DanielM