2016-12-22 1 views
0

В symfony и Doctrine я использую сеанс для сохранения результата запроса, затем позже я фильтрую этот результат с некоторыми параметрами. Проблема в том, что после изменения параметров я не могу получить исходный набор результатов. Вот кодПочему изменились данные сеанса?

Извлечение результатов и сохранения на сессии

$query = $this->getDoctrine()->getManager()->createQueryBuilder(); 
$query->select("sp") 
->from("CoreBundle:ServiceProvider","sp") 
->innerJoin("sp.offers","offer") 
->innerJoin("offer.service","service","with","offer.service = service") 
->innerJoin("sp.firstImage","fi") 
->andWhere("sp.city = :city_name")->setParameter("city_name",$cityName) 
->orderBy("sp.points" ,"DESC") 
->addOrderBy("sp.name" ,"ASC"); 
$queryAndFilters = $this->getFilters($query,$postData); 
$query = $queryAndFilters['query']; 
$filters=$queryAndFilters['filters']; 
$paginator = $this->get('knp_paginator'); 
$pagination = $paginator->paginate(
    $query, /* query NOT result */ 
    $pageNumber, 
    20/*limit per page*/ 
); 

$query = $query->getQuery(); 
$query->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true); 

$this->get('session')->set("results",$query->getResult()); 

, а затем в другой функции

фильтрации результатов

$results = $this->get('session')->get("results"); 

$filteredResults = array(); 

// print_r(array_keys($results[0])); 
foreach($results as $result){ 
    $sp = $result; 
    foreach($sp->getOffers() as $offer){ 
     // echo "found offer ".$offer->getName()." with price ".$offer->getPrice()."<br />"; 
     $sp->removeOffer($offer); 
     if($offer->getPrice() < $minPrice || $offer->getPrice() > $maxPrice){ 

     }else{ 
      $sp->addOffer($offer); 
      // echo 'added $offer '.$offer->getName()." with price : ".$offer->getPrice()."<br />"; 
     } 
     if(sizeof($sp->getOffers()) > 0){ 
      array_push($filteredResults,$sp); 
     } 
    } 
} 

первый раз я изменить $ minPrice и $ переменные maxPrice результаты фильтруются вправо и точно, что мне нужно , но после повышения $ maxPrice снова высокие цены не являются добавлено в $ filterResults

Я попытался также назначить $ offer и $ result новым переменным, но все еще не работает любая идея, как это исправить?

пс. я не могу изменить запрос или получить их уже с запросом.

+0

Вы _rewrite_ сущности в сеансе после изменения их атрибутов? – Timurib

+0

Не происходит перезаписи, это весь код, связанный с этим –

ответ

1

При сохранении сущностей в сеансе это объекты serialized со значениями, актуальными в момент сериализации. Следующие изменения объектов не влияют на сохраненные значения, если вы не переписываете их в сеансе.

Также по порядку сериализации имеет some limitations по адресу private.

+0

. Я действительно не понимаю, почему сериализация изменит результаты, если я НЕ изменил их –

+0

, как вы видите в коде сериализовано getArrayResult(), поэтому я серировал массив, даже сущности, и хотя я никогда не менял сериализацию, я не менял их. Я просто добавил, что новый массив, удаляемый из этого массива, работает, но чтение не является, и это вопрос. –

+0

Попробуйте 'unserialize (serialize ($ query-> getResult())) '. – Timurib