ORM 查询如何排除某个字段?如只排除 content 文本,其它字段都查询

ORM查询如何排除某些字段?如只排除content文本,其它字段都需要。

$data = Content::where('pid',1)->get(['id','title','time', ...]);`

这么写感觉很笨,有没有直接排除content字段,其它字段都要查询的方法呢?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 10
TimJuly

先说结论:我认为,需要查啥自己手动写在 Sql 里.

Mysql 并没有提供排除的查询方式,所以你要这样查询,无论是你人工做这个事儿还是程序自动帮你算出来要查询的字段,总之是要进行一步转换的.

那么我们就来说说程序怎么进行转换.

首先你要知道你表里所有的字段,这样才能进行排除.知道表里的所有字段的方式我能想到的有两种,一种是写死在你的 Model 里,还有一种是去数据库查询一遍.两种都有弊端.

第一种写死,如果你数据库有添加字段,是需要人工维护到程序里的,这样跟你自己手动在 Sql 里进行添加没有什么两样了,而且你数据库里结构发生变化证明有功能变更,这个时候你之前的 Sql 可能也会增加一些排除的字段或者有其他的变更,这样就要维护两份数据,不如在变更需求的时候直接变更之前手写的 Sql.

第二种程序进行查询,显然这会让你每次的查询 Sql 增加一条,当然你也可以加一个缓存来减少 Sql 的查询,不过要在数据库结构发生变更的时候记得清理缓存,否则会出现奇奇怪怪的 Bug.

7年前 评论

@TimJuly 那就是没有类似ThinkPHP的用法是吧?
普通查询某些字段

$Model->field('id,title')->select();

排除这些字段

$Model->field('content',true)->select();

要么就是 desctest 然后遍历需要排除哪些字段是吧。

7年前 评论
TimJuly

@yaobaliu 是的,官方没有提供这种查询方法,你可以自己去扩展一下.

7年前 评论

@小恪守 这只是在 display 的时候隐藏掉而已,查询时还是查了的。

6年前 评论

model里处理白名单

4年前 评论
66

model里配置安全字段和隐藏字段不就好了。。。。

4年前 评论

没有这种函数,可以使用隐藏字段,但是其实也是查询了 makeHidden

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!