在 Laravel Eloquent 中使用 with() 返回对象

Posted

技术标签:

【中文标题】在 Laravel Eloquent 中使用 with() 返回对象【英文标题】:Return object using with() in Laravel Eloquent 【发布时间】:2018-07-02 18:33:53 【问题描述】:

目前我得到这样的数据:

->with(['posts' => function ($query) 
            $query->active()->available()->limit(1)->with('user');
            ])

并将用户数据作为预期的对象数组返回。因为我使用了一个限制并且只需要一个结果,所以我想将它作为一个常规对象返回,而不是:

"data": value,
"posts": [
    
      "data": value,
      "user": 
        "data": value
      
    
  ]

我想把它返回为:

"data": value,
"post":
        
          "data": value,
          "user": 
            "data": value
          
        

最好的方法是什么?

【问题讨论】:

这里远射,但尝试用first()替换limit(1) @FelippeDuarte 根本不是一个坏主意,甚至在其他形式上也被建议,但这样做似乎不会触发 ->with('user') 部分,并且仍将 posts 作为数组返回:P 【参考方案1】:

在您的模型上创建一个 hasOne 关联,定义您想要的范围。

public function activePost()

    return $this->hasOne(Post::class)->active()->available();
]

然后调用 with('activePost.user') 以加载该单个、活动且可用的帖子及其关联用户。

【讨论】:

似乎是个主意!即使已经定义了 hasMany 关系,这是否可行?我刚刚遇到了 first() 的错误,实际上只返回一个结果而不是每个父对象的一个​​结果......有什么想法吗? 是的 - 他们可以并肩生活,他们将完全独立于彼此。您不能像上面有人建议的那样在with() 范围查询中使用first(),因为它期望返回查询,而不是模型。 我还需要在新协会上写first()吗? 不——因为它是hasOne Laravel 知道你只想要一个模型。让代码在您的项目中运行,看看它对您有何帮助。【参考方案2】:

只要你的关系是hasManyhasManyThroughbelongsToManymorphManymorphedByMany 关系(我认为这就是全部),从主要使用开始,急切加载将始终返回一个数组with 方法中的一个用于向关系添加子句。

引自 laracasts 论坛上的最佳答案:https://www.laracasts.com/discuss/channels/eloquent/first-and-take-do-not-work-correctly-in-eager-load-laravel?page=0)

@Dwight 的回答是正确的方法。

【讨论】:

...这是问题的答案吗?

以上是关于在 Laravel Eloquent 中使用 with() 返回对象的主要内容,如果未能解决你的问题,请参考以下文章

在 Eloquent 查询/Laravel 5.2 中使用变量

Laravel:在 API 测试中使用 Eloquent 模型

如何在 Laravel 5.8 中使用 Eloquent 进行查询?

在 Laravel 中使用 Eloquent 进行更高级的数据库查询

如何使用 Eloquent 在 Laravel 中开始查询?

如何在 laravel 5 中使用 Eloquent 更新数据透视表