laravel ORM 如何将with关联的数据放在平级

1. 运行环境

1). 当前使用的 Laravel 版本?

8.83.11

2). 当前使用的 php/php-fpm 版本?

PHP 版本:

PHP 7.3.4

2. 问题描述?

达成效果的代码为:

return self::where('user_id', $userId)->leftJoin('dispatch', 'dispatch_user_rule.dispatch_id', '=', 'dispatch.id')
->select(['dispatch.id', 'name', 'dispatch.created_at'])->get();

内容

[
    {
        "id": 1,
        "name": "滴答集团",
        "createdAt": "2022-05-13 15:08:43"
    },
    {
        "id": 2,
        "name": "嘀嗒拼车",
        "createdAt": "2022-05-16 10:51:31"
    }
]

使用ORM的with:

return self::where('user_id', $userId)->with('dispatch')->get();

目前得到的结果

[
    {
        "id": 1,
        "userId": 1,
        "dispatchId": 1,
        "createdAt": "2022-05-13 15:08:54",
        "updatedAt": "2022-05-13 15:08:56",
        "dispatch": {
            "id": 1,
            "name": "滴答集团",
        }
    },
    {
        "id": 3,
        "userId": 1,
        "dispatchId": 2,
        "createdAt": "2022-05-16 10:51:50",
        "updatedAt": "2022-05-16 10:51:52",
        "dispatch": {
            "id": 2,
            "name": "嘀嗒拼车",
        }
    }
]

最近才上手laravel,迫于代码洁癖不想混用DB库,问问各位大神这个在ORM中正确的写法是什么?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

API 资源《Laravel 9 中文文档》 Api资源处理一下数据 即可

1年前 评论
Error_404 (楼主) 1年前
Error_404 (楼主) 1年前
Error_404 (楼主) 1年前
Error_404 (楼主) 1年前
Error_404 (楼主) 1年前
Error_404 (楼主) 1年前
薄荷蓝的晴天 (作者) 1年前
Error_404 (楼主) 1年前
讨论数量: 24

API 资源《Laravel 9 中文文档》 Api资源处理一下数据 即可

1年前 评论
Error_404 (楼主) 1年前
Error_404 (楼主) 1年前
Error_404 (楼主) 1年前
Error_404 (楼主) 1年前
Error_404 (楼主) 1年前
Error_404 (楼主) 1年前
薄荷蓝的晴天 (作者) 1年前
Error_404 (楼主) 1年前

这个 orm with 是不能直接和主表数据同级的,字段之间的冲突程序自己也没办法解决 适应新的数据格式就行了

1年前 评论
Complicated

自己单独处理吧,框架没有直接的方法

1年前 评论

可在你的 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年前 评论
ncccc1 1年前

适应下数据就行

1年前 评论

Arr::dot 此方法可以将数组扁平化

1年前 评论
  1. 直接将关联的字段放到同级,需要注意关联是否存在 条件关联
    return [
     {
         "id": 1,
         "userId": 1,
         "dispatchId": 1,
         "createdAt": "2022-05-13 15:08:54",
         "updatedAt": "2022-05-13 15:08:56",
         "name": $this->whenLoaded('dispatch',$this->dispatch->name),
     },
    ]
  2. 使用MergeValue
    ...
    return [
     {
         "id": 1,
         "userId": 1,
         "dispatchId": 1,
         "createdAt": "2022-05-13 15:08:54",
         "updatedAt": "2022-05-13 15:08:56",
         $this->whenLoaded('dispatch',fn() => new MergeValue(['name' => $this->dispatch->name]),
     },
    ]
1年前 评论

适应性结构体不行吗

1年前 评论

记得orm有个方法可以实现这种效果

1年前 评论

Api资源,可以起到一个重新格式化结构的作用

1年前 评论

说实话 楼上好几个说资源的, 资源坑很多, 小白慎用, 我已经舍弃了。我觉得意义毫无

1年前 评论
Smilephp (作者) 1年前
nff93 1年前

append()了解一下

1年前 评论

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