框架:tp5
数据库:mysql
场景:
1、从db中取出数据集,遍历数据集,并在每个遍历的对象中再添加属性;
2、前端需要用到render进行分页,如下
<div class="page">
<div>
{$data->render()}
</div>
</div>
问题:
1、遍历使用foreach,并且加&符,进行动态更新数据集,发现不生效(看tp社区有人说是tp bug);
2、如上问题找到原因后,进行动态添加数据,出现如下问题
Indirect modification of overloaded element of think\paginator\driver\Bootstrap has no effect
解决:
问题1
原因是从数据库中查出的数据集是数据集对象,不是单纯的数组(查询的数据集dump核对一下),因此,直接添加属性,类似于给一个对象赋予新的属性而已;
单独此问题解决方案,可以先$data->toArray(),将对象转成数组,再foreach &;因此说是tp5 bug,是误解;
问题2
原因是,进行render 分页,我通过Db select()从数据库查出来的是个数据集对象,其中包含了数据集,分页数据(总页数,当前第几页,见如下),上面的toArray显然破坏了对象的数据结构,因此,达不到分页的目的,因此会有如上错误。
think\paginator\driver\Bootstrap::__set_state(array(
'simple' => false,
'items' =>
think\Collection::__set_state(array(
'items' =>
array (
0 =>
array (
'xx_id' => 49,
'xx_id' => 0,
'stime' => '2019-08-07 17:00:00',
'xxx_count' => 0,
'xxxx_count' => 0,
'xxx_map' => '{"x_count":0,"xx_count":0,"xx_count":0}',
),
),
)),
'currentPage' => 1,
'lastPage' => 3,
'total' => 23,
'listRows' => 10,
'hasMore' => true,
'options' =>
array (
'var_page' => 'page',
'path' => '/xxx.html',
'query' =>
array (
),
'fragment' => '',
'type' => 'bootstrap',
'list_rows' => 15,
),
'nextItem' => NULL,
))
为达到同时分页又能进行数据动态遍历重组的目的,可创建个新对象,赋值内容是取出来的数据集对象
$data_arr = $data;
$data_arr = $data_arr->items();//或$data_arr = $data_arr->toArray();
foreach($data_arr as $k=>$s_data){
//动态替换
}
而data在不变的情况下,继续使用{$data->render()} 进行分页,需要使用到重组数据的地方,可使用重组数据,重组数据,随着data的分页也会继续分页。
补充:按理就算是数据集对象,将对象拆解遍历重组应该也可以生效(未尝试,有兴趣的朋友可以尝试)