with 关联查询出来的数据怎么合并成一个喃?

想把article这一层合并到上一层 用什么方法呀 感觉多层不好看

        $users = $users::query()
            ->where('user_id', $request->user()->id)
            ->with('article')
            ->get();
        {
            "id": 1,
            "user_id": 104,
            "article": {
                "id": 1,
                "title": "测试标题",
                "content": "测试内容",
            }
        },
        {
            "id": 2,
            "user_id": 104,
            "article": {
                "id": 2,
                "title": "测试标题",
                "content": "测试内容",
            }
        },
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 18

那你循环组装呗,返回原始数据肯定要嵌套的(重复字段名)

1年前 评论
tiantian10000 (楼主) 1年前

这个层级本身就是 with 查询出来的结构,没办法改变。

要使之达到你的效果:

第一种:可以通过查询构造器的 join查询 来替代 with 查询

第二种:可以通过 API 资源 对查询后的数据进行转换

1年前 评论

我发现挺多人问这个的,期待有人给laravel提个pr。说下我的处理方式:

可在你的 Model 基类新增一个方法:

    /**
     * 格式化为一个扁平的数组
     *
     * @return array
     */
    public function toCollapse()
    {
        $result = $this->attributesToArray();
        foreach ($this->relationsToArray() as $relations => $item) {
            foreach ($item as $k => $v) {
                isset($result[$k]) && $k = $relations . '_' . $k;
                $result[$k] = $v;
            }
        }
        return $result;
    }

调用:

$brand = Brand::with('tran')->find(9);
dd($brand->toCollapse());

得到类似输出:

array:11 [
  "id" => 9
  "icon" => ""
  "created_at" => 1647844552
  "updated_at" => 1647844552
  "tran_id" => 59
  "brand" => "BMW"
  "first_letter" => "B"
  "brand_id" => 9
  "language" => "en"
  "tran_created_at" => 1648281558
  "tran_updated_at" => 1648281558
]
1年前 评论
tiantian10000 (楼主) 1年前
kolin 1年前
忆往昔弹指间 (作者) 1年前
$articles = $users::query()
    ->where('user_id', $request->user()->id)
    ->with('article')
    ->get()
    ->pluck('article');

不知道是不是你想要的效果。

1年前 评论
醉挽清风 1年前
随波逐流
1年前 评论

为啥要拍扁呢 面向对象不挺好的吗 一个对象装另一个对象

1年前 评论
tiantian10000 (楼主) 1年前

Arr::dot() 数据扁平化

1年前 评论
  • 补充楼上
    ...
    use Illuminate\Support\Arr;
    ...
    $array1 =  ['products' => ['toys' => ['price' => 100]]];
    $doted1 = Arr::dot($array1);
    print_r($doted1);     // ['products.toys.price' => 100]
    $array2 = ['technologies' => ['laptop' => 'Dell']];
    $doted2 = Arr::dot($array2);
    print_r($doted2);    // ['technologies.laptop' => 'dell']
    

```

1年前 评论

这个东西看你以什么表为主体了 如果是 topic 表为主体 很轻松得到你想要的数据 如果是以likes表为主体数据结构得到你想要的结构的话 就需要你自己重新处理下 map 或者 foreach 等

1年前 评论

用join连接查询比查询出来两次循环好,请求速度会快

1年前 评论

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