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

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

  •  
  •   dvaknheo · 31 天前 · 4158 次点击
    这是一个创建于 31 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用 L 记好几天了。想吐槽的好多。
    刚刚一个是:

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

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

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

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

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

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


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