Laravel 一大悲剧是开发者跟不上作者的智商

2019-11-06 21:34:53 +08:00
 dvaknheo
用 L 记好几天了。想吐槽的好多。
刚刚一个是:

实例: 高级用户表(小表)里,加上 大的基础用户表(大表)的数据,根据 user_id 一对一关联。只要大表某状态(无索引)的用户名。

现有操作: 从大表里 where() 某状态的所有数据, 然后 小表里 whereIn 前面的数据!
你还是学点 sql 吧。

最直接的做法, 小表 left join 大表。
追求速度的方法小表查询出来之后,做个 子查询。

似乎 L 记还有 自动切换的模型方法。 我得从 sql,然后转到 where() 表达方式,然后再转到 模型表达方式。
7291 次点击
所在节点    PHP
14 条回复
dvaknheo
2019-11-06 21:38:29 +08:00
大表先查
User::where("status", 0)->get(); ,为什么这样, 因为 后面还要用到 Model 类的
User->getUserImage() { /* 用到 $this->uid; */ } 方法。
mokeyjay
2019-11-06 21:40:04 +08:00
没看懂你想表达什么
不过 laravel 确实在一些情况下会使用 whereIn,比如关联模型预加载时
dvaknheo
2019-11-06 21:57:58 +08:00
我整理一下, 高级用户表,根据一些数据,要追加 基础用户表的 用户名,头像。 高级用户表和基础用户表是 user_id 一对一,这很简单吧。
我要显示我深圳地区的 VIP 会员的状态和头像,只要在线的。

从 VIP 会员表(小表 Vip )里查出地址:深圳,然后 连表查询 基础 用户表(大表,UserModel), 状态为在线。 一个 left join user_id 完事。

为什么会先从大表查, 然后小表里 whereIn (user_id) 呢。

原因是获取头像这个操作,是写在 UserModel 类的方法是要根据 $this->user_id 做一堆操作的(包括连其他表!);不接受外部 user_id.

用户名,也是从 UserModel->username 得的。

老程序员的想法,先是,怎么写 sql,然后改成 where() 模式, 然后再想怎么转成 model .

而那些 L 记没学过 sql 的,和 Hibernate 之类 ORM 的。根本就不考虑 sql 性能。反正一把梭就是。
产生了类似 count( Model->where()->get()); 之类的性能悲剧
zibber
2019-11-06 22:50:40 +08:00
orm 你关联顺序反了
wangyzj
2019-11-06 23:20:38 +08:00
lihongming
2019-11-06 23:35:00 +08:00
本着尽量不写 sql 的原则,我会优先考虑$this->hasOne(‘RelatedModel’)
jhdxr
2019-11-06 23:38:27 +08:00
尽管你补充了一大堆,还是没看懂你想表达什么。也许你的代码水平能比你的语文水平好一些(所以不如直接贴代码吧

然后例如
count( Model->where()->get());
这种悲剧,难道不是开发者自己菜吗?
Model->where()->count() 难道没有这样的方法吗?

然后 whereIn 正确的用法的确是会转成 subquery 的啊?
文档( https://laravel.com/docs/5.8/queries#where-exists-clauses )里有个 whereExists 的用法,举一反三应该不难?
jhdxr
2019-11-06 23:45:27 +08:00
不知不觉 laravel 都出到 6.x 了么。。。我对它的印象好像还停留在 5.3 还是 5.1 来着 orz
akira
2019-11-07 00:52:31 +08:00
自己的小项目会用 orm,但是正式要上线的东西 还是习惯直接写 sql。
laravel
2019-11-07 09:32:44 +08:00
weirdo
2019-11-07 10:06:52 +08:00
楼主想说什么完全没明白,建议楼主直接上代码。
还有标题,“开发者跟不上作者的智商” 这句话里,开发者指谁,作者又指谁。
开发者指框架开发者,作者指产品作者说得通,
开发者指产品开发者,作者指框架作者也说得通。
allen9009
2019-11-07 10:18:45 +08:00
我掐指一算,你即将被一顿喷
dvaknheo
2019-11-09 20:03:56 +08:00
@jhdxr VipModel::WhereIn ( function ($query)) 方式走不通,是 因为要得到的是 UserModel 之后要得到的 UserModel 里做一些额外操作
each UserModel->getAvator(); 没有 UserModel->getAvatorByid($id); 这个方法。
jhdxr
2019-11-09 23:29:51 +08:00
当然不应该有 UserModel->getAvatorByid($id); 这种方法,但是你可以根据 id 找到对应的 UserModel,然后去拿对应的 avatar。

例如 UserModel::find($id)->getAvatar();

恩没错纠正你一下,如果你这儿想打的是头像,那拼写应该是 avatar,最后不是 or。

另外如果 VipModel 和 UserModel 是有关联的,那你完全可以直接从 VipModel 拿到 UserModel ( https://laravel.com/docs/5.8/eloquent-relationships#one-to-one-polymorphic-relations


看你的发帖历史居然还是框架作者???想喷一个框架前把它的文档先读一遍好吗???另外这个楼里就没人能看懂你在说什么的,语文水平太差不是你的错,程序员之间沟通,你还是直接上代码比较省事。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/616998

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX