【问题标题】:Why is my session data getting changed?为什么我的会话数据会发生变化?
【发布时间】:2016-12-22 12:30:34
【问题描述】:

在 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 之后,高价没有被添加到 $filteredResults

我也尝试将 $offer 和 $result 分配给新变量,但仍然无法正常工作 知道如何解决这个问题吗?

ps。我无法更改查询或使用查询获取它们。

【问题讨论】:

  • 更改属性后是否重写会话中的实体?
  • 没有重写这是与此相关的整个代码

标签: php symfony session doctrine-orm


【解决方案1】:

当您在会话中保存实体时,这些实体是 serialized,其值在序列化时刻实际存在。如果您不在会话中重写实体,则实体的下一次更改不会影响存储的值。

实体序列化在private 属性上也有some limitations。

【讨论】:

  • 我真的不明白为什么如果我没有改变序列化会改变结果
  • 正如您在代码中看到的,序列化的是 getArrayResult() 所以我序列化了一个数组甚至不是实体,即使我序列化的内容我没有更改它们,我只是添加了一个从中删除的新数组数组正在工作,但读取不是,这是问题
  • 尝试unserialize(serialize($query-&gt;getResult()))。
  • 执行此操作在 $sp->getOffers() 中获得 0 个优惠;
  • 表示offer只是不序列化。相关属性是protected 还是private?
猜你喜欢
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
相关资源
最近更新 更多