【问题标题】:Eloquent eager loading not working with nested fields雄辩的急切加载不适用于嵌套字段
【发布时间】:2019-01-26 20:44:08
【问题描述】:

我正在尝试获取具有关系和嵌套字段的用户模型。第一次尝试效果很好:

$user = \App\User::where('id', auth()->user()->id)->with(['userdoc'])->get();

它返回整个 userdoc 对象。但是我只想要两个字段,所以我正在尝试:

$user = \App\User::where('id', auth()->user()->id)->with(['userdoc:id,number'])->get();

这样它就会在toArray() JSON 中返回userdoc:null

根据https://laravel.com/docs/5.5/eloquent-relationships#eager-loading 的文档,这似乎没问题

我在 Laravel 5.6 上。

添加更多信息:

没有特定字段获取整个对象

$user = \App\User::where('id', auth()->user()->id)->with('userdoc')->get();
return response()->json($user->toArray(), 200);

[
    {
        "id": 11,
        "email": "xxxxx",
        "slug": "xxxxx",
        "created_at": "xxxxx",
        "updated_at": "xxxxx",
        "deleted_at": null,
        "first_name": "xxxxx",
        "last_name": "xxxxx",
        "is_verified": 0,
        "userdoc": {
            "id": 11,
            "created_at": "2018-08-20 13:20:29",
            "updated_at": "2018-08-20 13:20:29",
            "deleted_at": null,
            "user_id": 11,
            "type": "document",
            "number": "xxxxxxxxx"
        }
    }
]

确定userdoc字段使对象变为null

$user = \App\User::where('id', auth()->user()->id)->with('userdoc:id,number')->get();
return response()->json($user->toArray(), 200);

[
    {
        "id": 11,
        "email": "xxxxxxxxxxx",
        "slug": "xxxxxxxxxxx",
        "created_at": "xxxxxxxxxxx",
        "updated_at": "xxxxxxxxxxx",
        "deleted_at": null,
        "first_name": "xxxxxxxxxxx",
        "last_name": "xxxxxxxxxxx",
        "is_verified": 0,
        "userdoc": null
    }
]

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    您需要删除括号中的[]

    $user = \App\User::where('id', auth()->user()->id)->with(['userdoc:id,number'])->get();
    _________________________________________________________^___________________^
    

    应该是:

    $user = \App\User::where('id', auth()->user()->id)->with('userdoc:id,number')->get();
    

    您也应该在 with 传递的字段中传递外键:

    ...->with('userdoc:id, user_id, number')
    

    【讨论】:

    • 它返回相同的:(
    • 请告诉我们结果
    • 添加了有问题的结果
    • with 方法接受关系数组。有这些方括号就可以了(即使在这种特定情况下不需要)。
    【解决方案2】:

    你的结果是因为你没有选择相关的主键user_id。试试这个

    $user = \App\User::where('id', auth()->user()->id)->with(['userdoc:id,user_id,number'])->get();
    

    【讨论】:

    • 可以添加userdoc表结构吗??
    • 添加了有问题的示例
    【解决方案3】:

    我猜您的userdocs 表有一个user_id 属性,并且您在usersuserdocs 之间使用一对多关系。如果是这样的话,你还需要从userdoc获取外键:

    $user = \App\User::where('id', auth()->id())->with(['userdoc:id,number,user_id'])->get();

    【讨论】:

      【解决方案4】:

      我必须在嵌套的 Eager 加载中添加 id 才能获取客户的名称:

      $foo = Visitor_visit::with('client:id,name')->get();
      

      否则为空,希望对某人有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-22
        • 2019-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多