V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dvaknheo
V2EX  ›  PHP

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

  •  
  •   dvaknheo · 2019-11-06 21:34:53 +08:00 · 7291 次点击
    这是一个创建于 1833 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用 L 记好几天了。想吐槽的好多。
    刚刚一个是:

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

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

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

    似乎 L 记还有 自动切换的模型方法。 我得从 sql,然后转到 where() 表达方式,然后再转到 模型表达方式。
    14 条回复    2019-11-09 23:29:51 +08:00
    dvaknheo
        1
    dvaknheo  
    OP
       2019-11-06 21:38:29 +08:00
    大表先查
    User::where("status", 0)->get(); ,为什么这样, 因为 后面还要用到 Model 类的
    User->getUserImage() { /* 用到 $this->uid; */ } 方法。
    mokeyjay
        2
    mokeyjay  
       2019-11-06 21:40:04 +08:00
    没看懂你想表达什么
    不过 laravel 确实在一些情况下会使用 whereIn,比如关联模型预加载时
    dvaknheo
        3
    dvaknheo  
    OP
       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
        4
    zibber  
       2019-11-06 22:50:40 +08:00
    orm 你关联顺序反了
    wangyzj
        5
    wangyzj  
       2019-11-06 23:20:38 +08:00
    lihongming
        6
    lihongming  
       2019-11-06 23:35:00 +08:00 via iPhone
    本着尽量不写 sql 的原则,我会优先考虑$this->hasOne(‘RelatedModel’)
    jhdxr
        7
    jhdxr  
       2019-11-06 23:38:27 +08:00   ❤️ 5
    尽管你补充了一大堆,还是没看懂你想表达什么。也许你的代码水平能比你的语文水平好一些(所以不如直接贴代码吧

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

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


    看你的发帖历史居然还是框架作者???想喷一个框架前把它的文档先读一遍好吗???另外这个楼里就没人能看懂你在说什么的,语文水平太差不是你的错,程序员之间沟通,你还是直接上代码比较省事。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3811 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 00:54 · PVG 08:54 · LAX 16:54 · JFK 19:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.