关于 Eloquent ORM 对数据处理的思考

处理方法见评论区

Admin用户模型

<?php

namespace App\Models;

class Admin extends User

    public function adminGroup()
    {
      return $this->hasOne(AdminGroup::class,'id', 'group_id');
    }

AdminGroup用户组

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class AdminGroup extends Model
{
    protected $fillable = [
      'group_name','group_desc'
    ];

    public function admin()
    {
        return $this->belongsTo(Admin::class, 'group_id', 'id');
    }
}

控制器中

<?php

namespace App\Http\Controllers\Admin;

use App\Models\Admin;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;

class AdminGroupsController extends Controller
{
    public function index()
    {
        $user = Admin::with('adminGroup')->get();
        echo $user;
    }

前端显示
[{"id":1,"name":"admin","setter":"admin","status":1,"real_name":"wangjing","mobile":null,"job_id":null,"job_tel":null,"seat":1,"count":null,"last_login_ip":"127.0.0.1","last_login_date":null,"created_at":null,"updated_at":"2019-04-15 09:20:03","group_id":1,"admin_group":{"id":1,"group_name":"PHP","group_desc":"PHP","created_at":"2019-04-16 16:11:45","updated_at":"2019-04-16 16:11:49"}}]

但是我期望的显示的是
[{"id":1,"name":"admin","setter":"admin","status":1,"real_name":"wangjing","mobile":null,"job_id":null,"job_tel":null,"seat":1,"count":null,"last_login_ip":"127.0.0.1","last_login_date":null,"created_at":null,"updated_at":"2019-04-15 09:20:03","group_id":1,group_name":"PHP","group_desc":"PHP"}}]

如果用别的方法

SELECT
    admins.*,
    admin_groups.group_name

FROM
    admins
    LEFT JOIN admin_groups ON admins.group_id = admin_groups.id

大佬们进来看下呗

如果我用Eloquent ORM 应该怎么做?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 18
arunfung

用集合处理一下就好了

1个月前 评论
anjing

@arunfung 可否举个例子 :kissing_heart:

1个月前 评论
arunfung

@anjing

Admin::with('adminGroup')->get()->map(function($item) {
         return $item->flatten()
})
1个月前 评论

Eloquent ORM 的话 $appends & 访问器 :stuck_out_tongue_closed_eyes: ,不过没有集合来的直接了

1个月前 评论
anjing

@arunfung 还是不晓得怎么用太笨了 发现文档中有集合和https://learnku.com/docs/laravel/5.7/collections/2279#method-flatten

1个月前 评论
anjing

@Lhao :relaxed:用Eloquent ORM 取 文章评论这种很方便 突然想到这个试了一下就麻爪了...

1个月前 评论
arunfung

@anjing 啊,我贴出的代码无法做到你想要的效果么?

1个月前 评论
anjing

@arunfung

public function index()
    {
        Admin::with('adminGroup')->get()->map(function($item) {
            echo $item->flatten();
    });
BadMethodCallException
Call to undefined method App\Models\Admin::flatten()
1个月前 评论
arunfung

@anjing
那就构建成集合处理

Admin::with('adminGroup')->get()->map(function($item) {
            return collect($item)->flatten();
    })->toArray();
1个月前 评论
anjing

@arunfung 出来了多谢,还是得多看看文档,感觉一直半瓶子晃荡.........

1个月前 评论
arunfung

@anjing 简单一点理解就是把二维数组转成一维数组

1个月前 评论
anjing

@arunfung 学习到了

1个月前 评论

你可以考虑用修改器加个append数据getGroupIdAttribute
如果relation loaded就返回对应数据,否则返回null

1个月前 评论
anjing

@Kamicloud ,您说的那种方法我得再看看文档,刚看Eloquent ORM 用它做这类型的数据,它一下节就是集合 :joy: 也就是 arunfung 提供的解决办法, 感觉文档吃透了 可以简化很多逻辑,优雅(省事)

1个月前 评论
Krisji

@arunfung @anjing 一看你就是喜欢骚操作的人 :smiley:

1个月前 评论
anjing

@Krisji ~其实还有偏差不过新学到很多了..

1个月前 评论
arunfung

@Krisji 哈哈被发现了,只要操作够骚,人家就没那么快追上你 :blush:

1个月前 评论
__中国人

牛逼,学到了。不过标题可以改一下,以便更多人看到

1个月前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!