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); 
     } 
    } 
} 

처음 나는 변경 $ 최소 가격 및 $ maxPrice 변수 결과가 정확하게 필터링되고 이 필요하지만 $ maxPrice를 높이면 다시 가격이 높지 않습니다. $ filteredResults에 추가했습니다.

나는 새로운 변수에 $ offer와 $ result를 할당하려고했지만 여전히 작동하지 않습니다. 어떻게 해결할 수 있습니까?

ps. 나는 질의를 변경하거나 질의로 이미 가져올 수 없다.

+0

세션의 엔티티가 속성을 변경 한 후에 그 엔티티를 쓰지 않습니까? – Timurib

+0

재 작성이 일어나지 않습니다.이 코드와 관련된 전체 코드는 –

답변

1

세션에 엔티티를 저장하면이 엔티티는 일련 화 순간에 실제 값인 serialized입니다. 엔터티의 다음 변경 사항은 세션에서 다시 작성하지 않으면 저장된 값에 영향을주지 않습니다.

또한 private 속성에 some limitations이라는 항목이 있습니다.

+0

입니다. 왜 내가 serialize하지 않으면 결과가 바뀌는 지 이해할 수 없습니다. –

+0

코드에서 볼 수 있듯이 직렬화가 getArrayResult()이므로 배열을 serialize하지 않았습니다. 심지어 엔티티 심지어 내가 serialize 한 것들을 변경하지 않았다. 나는이 배열로부터 제거하는 새로운 배열을 추가했지만 작동하지 않는다. 그러나 reading은 그렇지 않다. 그리고 이것은 질문이다. –

+0

'unserialize (serialize ($ query-> getResult()))'. – Timurib

관련 문제