【问题标题】:Laravel API Routes manipulate the default JSON returnLaravel API 路由操作默认 JSON 返回
【发布时间】:2018-10-01 16:30:02
【问题描述】:

假设我有 2 张桌子。 users & books。 桌子看起来像这样 用户:

id, name
1, Jone
2, Doe

书籍:

id, name, user_id
3, Dummy book1, 1
4, Dummy book2, 1
5, Dummy book3, 2

当我尝试归还属于这样一个用户(例如用户 1)的所有书籍时

$query->where('id', 1)->join('books', 'users.id', '=', 'books.user_id');

我得到 JSON,但问题是 JSON 显示 id 的书籍不是这样的用户:

id: 3,//this is the book id not the user id
user_id: 1
...
...
id: 4,
user_id: 1

如何让我的查询将 id 显示为像这样的用户 id

id:1
... whatever

更好的是,我如何操作整个 JSON 以便我可以重命名键?例如 books.name 到 books_name 和 users.name 到 user_name 我不喜欢默认的 JSON 返回

我问这个的原因之一是如果您加入 2 个或更多表,id 将永远是最后一个table.id

【问题讨论】:

  • 你能发布整个查询吗?如果您没有明确说明要选择哪些属性,SQL 将无法知道您是想要 users.id 还是 books.id,因为您正在加入这些表。
  • 你可以使用->select(DB::raw("users.id AS user_id",), ...other rows you want to get back from the DB)
  • @Derek 这是一个更清晰的答案,它让我可以控制查询返回的内容。把它作为答案,这样我就可以选择它作为正确的答案。
  • 我很高兴能帮上忙,@Yamona!

标签: json laravel laravel-5


【解决方案1】:

我建议以真正的 Laravel 方式使用关系。因此,在您的书籍模型中,您将与用户建立关系。然后,您可以在查询中使用 with('user') 方法来急切加载用户!更简单、更清洁!

Book::find($id)->with('user');

在处理 ID 时,使用 find 方法会更好。

然后在您的 Book 模型中:

public function user()
{
    return $this->belongsTo(User::class);
}

我实际上并不知道这本书和用户之间的关系,所以我只是猜测。

另一个提示:如果您在控制器中执行此操作,请使用Route Model Binding,这样您甚至不必通过 ID 查找该书。

【讨论】:

    【解决方案2】:

    实现你想要的最简单的方法是在laravel构建select中定义参数:

    $query->select(DB::raw("users.id AS user_id",), ...other rows you want to get back from the DB) 
    

    只需确保在选择中定义您需要的参数即可。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2016-09-21
      • 2016-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多