【问题标题】:Return object using with() in Laravel Eloquent在 Laravel Eloquent 中使用 with() 返回对象
【发布时间】: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

标签: php laravel eloquent lumen


【解决方案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 的回答是正确的方法。

【讨论】:

  • ...这是问题的答案吗?
猜你喜欢
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
相关资源
最近更新 更多