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

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

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

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

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

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

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

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

    然后 whereIn 正确的用法的确是会转成 subquery 的啊?
    文档( https://laravel.com/docs/5.8/queries#where-exists-clauses )里有个 whereExists 的用法,举一反三应该不难?
    jhdxr
        8
    jhdxr   77 天前
    不知不觉 laravel 都出到 6.x 了么。。。我对它的印象好像还停留在 5.3 还是 5.1 来着 orz
    akira
        9
    akira   77 天前
    自己的小项目会用 orm,但是正式要上线的东西 还是习惯直接写 sql。
    laravel
        10
    laravel   76 天前
    weirdo
        11
    weirdo   76 天前
    楼主想说什么完全没明白,建议楼主直接上代码。
    还有标题,“开发者跟不上作者的智商” 这句话里,开发者指谁,作者又指谁。
    开发者指框架开发者,作者指产品作者说得通,
    开发者指产品开发者,作者指框架作者也说得通。
    allen9009
        12
    allen9009   76 天前
    我掐指一算,你即将被一顿喷
    dvaknheo
        13
    dvaknheo   74 天前
    @jhdxr VipModel::WhereIn ( function ($query)) 方式走不通,是 因为要得到的是 UserModel 之后要得到的 UserModel 里做一些额外操作
    each UserModel->getAvator(); 没有 UserModel->getAvatorByid($id); 这个方法。
    jhdxr
        14
    jhdxr   74 天前
    当然不应该有 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   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   804 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 22:59 · PVG 06:59 · LAX 14:59 · JFK 17:59
    ♥ Do have faith in what you're doing.