打开 post.provider,在文件里的 sqlFragment 里面添加一个查询片断,名字叫 leftJoinOneFile,它的值可以用一个字符模板组织一个查询的片断,用 LEFT JOIN 加上 LATERAL 关键词,然后用一个子查询创建一个要拼接的数据表,SELECT 所有的东西,来自 file 数据表,用 WHERE 设置一个条件,条件是 file 里的 postId 等于 post 数据表里的 id。 再用 ORDER BY 设置一下排序,按 file 的 id 这个栏目的值降序排列。最后再用 LIMIT 限制结果的数量,把它设置成 1。
给这个子查询的结果起个名字叫 file ,在 ON 的后面设置拼接条件,条件是 post 里的 id 等于 file 里的 postId
下面还得再定义一个查询片断,名字是 file,用一个字符模板,这段查询里面,可以使用 CAST 把一个数据转换成 JSON 格式的。 AS JSON,然后在这个 AS JSON 的前面设置一下具体的数据,这个数据可以先用 IF 做一下判断,判断的件是 COUNT 一下 file.id ,如果没有相关的文件,就用一个 NULL,如果有,可以用 GROUP_CONCAT ,连接一组数据,里面用 DISTINCT 去掉重复,数据可以用 JSON_OBJECT 组织一个对象,对象里面有 id 属性,对应的值是 file 里的 id,再添加一个 width 属性,对应的值是 file 里的 width,还需要一个 height 属性,对应的值是 file 里的 height 。
打开 post.service,找到 getPosts 这个函数,修改一下在这里定义的查询,在 SELECT 的下面,可以添加一个 sqlFragment 里的 file 这个查询片断。
然后在下面,还需要加上 sqlFragment 里的 leftJoinOneFile ,最后还得再用一个 GROUP BY,按 post.id 分下组。
下面可以到 HTTP 客户端试一下,打开 内容列表 这个请求,发送一下。 提示服务暂时出了点问题,可以在终端观察一下具体的错误, 提示有个栏目没找到,应该是我们在查询里写错了。
打开 post.provider,这个 COUNT 的东西是 file 里的 id ,修改一下。
然后回到 HTTP 客户端再试一下,发送一下内容列表请求,这个结果还有点问题,回到项目,这里忘了给这个栏目起名字了,用 AS ,起个名字叫 file 。
再回到 HTTP 客户端试一下,发送一下请求。现在内容项目里面会出现一个 file 属性,如果内容没有相关的文件,它的值就会是 null。
如果内容有相关的文件,它的值就会是一个文件对象,里面有文件的 id,width 还有 height 。