关联查询的问题 求大神详解

问题1:关联查询 应该用 with 还是wherehas 还是用join查询比较好喃?

问题2: 如下查询 用with 想把 user那一层提出来 怎么做呀 就是合并一个对象 不用嵌套一层

问题3: 查询后的数据 如果要进行处理或者筛选 应该怎么操作? 比如我想把查询后的数据里面的email 隐藏几位 把手机号 不显示

问题4: with关联查询后列表 里面的user那个名称想改成detail 怎么修改喃?

$userFollow = $userFollow::query()->where('user_id', $user->id)->with('user')->get();
{
    "status": "success",
    "code": 200001,
    "message": "操作成功",
    "data": {
        "id": 1,
        "type": 0,
        "user_id": 104,
        "follow_id": 30,
        "status": 0,
        "user": {
            "id": 30,
            "email": 322332@qq.com,
            "phone": 32233233333,
        }
    },
    "error": null
}
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 3
laravel_peng
  1. 首先你要明白 withwhereHasjoin 都执行了那些 sql 语句。知道它们做了什么就好区分了。

    简单分析

    • with 是预加载关联数据,它对于 N+1 慢查询问题很有效。本质上是执行两个 SQL 查询。先查出列表数据,再根据列表数据的所有关联字段进行 in 查询,查出所有关联数据。(数据量大的话,关联 id 的 in 查询会很慢 )它对数据不进行过滤,只要有关联都能查询出来。除非传闭包增加加 where 条件。
      //举个例子
      select * from `posts`
      select * from `authors` where `authors`.`id` in (?, ?, ?, ?, ?) [1,2,3,4,5]
    • whereHas 是查询是否存在,本质是一个 exists 的子查询。可以对数据进行过滤,但不进行关联数据的返回展示。这里有关于 whereHas 的瓶颈问题
    • join 是联表查询,生成的 inner join 的语句,在数据量大的时候可以使用。laravel模型关联查询与JOIN哪个性能好
  2. with 关联的数据单独取出来,不用嵌套的方式。这种只能对数据进行二次处理,将嵌套数据拿到上一层,原嵌套数据 unset()

  3. Eloquent 的模型 访问器,可以了解一下,它可以加工处理 Eloquent 模型查询出来的数据。字段隐藏可以使用 Eloquent 模型的 hidden 属性,默认的 User 模型的密码都是隐藏不返回的,它就是在 hidden 数组属性里面添加了密码字段完成的。

  4. with 的修改名称,可以将你 Eloquent 模型关联的方法名称修改为 detail 就行。

    // 关联的方法名称修改一下,就可完成。
    public function detail(){
     return $this->belongsTo(XX::class, "parent_id");
    }
1年前 评论

with 可以再次進行filter 返回符合條件的關聯數據

$mode->with([
    'posts' => function ($query)]);
1年前 评论
laravel_peng
  1. 首先你要明白 withwhereHasjoin 都执行了那些 sql 语句。知道它们做了什么就好区分了。

    简单分析

    • with 是预加载关联数据,它对于 N+1 慢查询问题很有效。本质上是执行两个 SQL 查询。先查出列表数据,再根据列表数据的所有关联字段进行 in 查询,查出所有关联数据。(数据量大的话,关联 id 的 in 查询会很慢 )它对数据不进行过滤,只要有关联都能查询出来。除非传闭包增加加 where 条件。
      //举个例子
      select * from `posts`
      select * from `authors` where `authors`.`id` in (?, ?, ?, ?, ?) [1,2,3,4,5]
    • whereHas 是查询是否存在,本质是一个 exists 的子查询。可以对数据进行过滤,但不进行关联数据的返回展示。这里有关于 whereHas 的瓶颈问题
    • join 是联表查询,生成的 inner join 的语句,在数据量大的时候可以使用。laravel模型关联查询与JOIN哪个性能好
  2. with 关联的数据单独取出来,不用嵌套的方式。这种只能对数据进行二次处理,将嵌套数据拿到上一层,原嵌套数据 unset()

  3. Eloquent 的模型 访问器,可以了解一下,它可以加工处理 Eloquent 模型查询出来的数据。字段隐藏可以使用 Eloquent 模型的 hidden 属性,默认的 User 模型的密码都是隐藏不返回的,它就是在 hidden 数组属性里面添加了密码字段完成的。

  4. with 的修改名称,可以将你 Eloquent 模型关联的方法名称修改为 detail 就行。

    // 关联的方法名称修改一下,就可完成。
    public function detail(){
     return $this->belongsTo(XX::class, "parent_id");
    }
1年前 评论

在使用with 关联查询时,如果想要同级数据需要在 Resource 中再处理一次

1年前 评论

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