我想将记录集的行转换为JSON,但不包括任何最终在JavaScript中未定义的空条目.例如,假设我有表testdata
条目
id | prop1 (integer) | prop2 (text)
-------------------------------------
1 | 42 | 'Answer'
2 | NULL | 'No prop one'
3 | 0 | NULL
Run Code Online (Sandbox Code Playgroud)
然后执行
SELECT row_to_json(testdata) FROM testdata
Run Code Online (Sandbox Code Playgroud)
我得到的是:
{"id":"1","prop1":"42","prop2":"Answer"}
{"id":"2","prop1":null,"prop2":"No prop one"}
{"id":"3","prop1":"0","prop2":null}
Run Code Online (Sandbox Code Playgroud)
但相反,我想要的是:
{"id":"1","prop1":"42","prop2":"Answer"}
{"id":"2","prop2":"No prop one"}
{"id":"3","prop1":"0"}
Run Code Online (Sandbox Code Playgroud)
这可能吗?根据PostgreSQL 9.3 的JSON函数文档,只有一个额外的选项或参数row_to_json
,但设置pretty_bool=true
不会删除空值,所以似乎答案可能是否定的.但这似乎也是一个非常明显和有用的功能,所以我希望别人找到了我错过的东西.
我的最终目标是通过GET
调用PHP页面来检索JavaScript中的记录.我是否最好从更标准的记录集中构建PHP中的JSON,而不是使用PostgreSQL的JSON例程?
通过列表的分区,我的意思是一组列表元素,使得任何一对不同的子集的交集是空的,并且所有子集的并集是等于原始列表的子集.
例如,如果我的输入列表是,{1,?,x}
那么我想要一个返回的函数
{ {{1},{?},{x}}, {{1,?},{x}}, {{1,x},{?}}, {{1},{x,?}}, {{1,?,x}} }
Run Code Online (Sandbox Code Playgroud) 如果我有两个表,比如说,foos
并且bars
在多对多关系中(通过bars_foos
连接表,在这种情况下),CakePHP 3.0中包含与每个Foo关联的Bars的ID数组的最佳方式是什么? RequestHandler通过_serialize属性返回的JSON?
具体来说,我希望能够访问site/foos.json
并看到这样的事情:
{
"foos": [
{
"id": 1,
"name": "A foo",
...
"bar_ids": [1, 3, 5]
},
{
"id": 2,
"name": "Foo too",
...
"bar_ids": [2]
]
}
Run Code Online (Sandbox Code Playgroud)
作为奖励,如果每个Foo也属于ToMany Bazzes,这应该仍然有用,所以我最终得到了,例如,
...
"bar_ids": [1, 3, 5],
"baz_ids": [37, 42]
...
Run Code Online (Sandbox Code Playgroud)
是否有一种直接的方法来实现这一点,很容易应用于许多模型,并不会导致过多的数据库查询?
我已经设法以两种方式粗略地完成了这项工作,但是对于快速且容易地推广到许多模型而言似乎都不成熟.我担心添加新查询或查询字段以获取可能已经存在于CakePHP中的信息的效率,如果我只能找到正确的语法来实现它.
一种方法是通过Foo实体中的_getBarIds()
函数和设置创建虚拟字段protected $_virtual = ['bar_ids']
.该函数使用TableRegistry查找和查询bars_foos
与当前Foo关联的Bar实体的连接表,并将它们作为PHP数组返回.关键功能大致如下:
// In src/Model/Entity/Foo.php, protected function _getBarIds:
$bars_foos = TableRegistry::get('Bookmarks_Tags');
$these_bars = $bars_foos->find()
->select(['bar_id'])
->where(['foo_id' => $this->id]);
Run Code Online (Sandbox Code Playgroud)
这样做效果相当不错,但是 …