首页 > 解决方案 > 包含 Laravel 8 对在自己的属性中加入数据

问题描述

我在 Laravel 8 Eloquent 中成功地做一个 rightJoin。我想将数据从我要加入的表中隔离出来,作为它自己在对象上的属性。

我的雄辩代码:

return Book
    ::rightJoin('tableB', 'tableB.book_id', '=', 'book.id')
    ->where('tableA.user_id', $uid)
    ->get();

现在我得到的数据被格式化为例如:

[
    tableA.col1,
    tableA.col2,
    tableB.col1,
    tableB.col2
]

我希望返回的对象结构如下:

[
    tableA.col1,
    tableA.col2,
    tableB [
        col1,
        col2
    ]
]

我这样做是为了获取用户已经开始阅读的书籍列表,并希望将进度信息作为自己的属性来满足前端预期的结构。

我当然可以在后端使用 PHP 处理和重组数据,但这感觉相当难看。是否有 Laravel 8 Eloquent 功能可以帮助我按照前端现在期望的方式构造返回的数据?

标签: laraveleloquent

解决方案


您正在寻找的是belongsTo(或hasOne视情况而定)关系。

模型/Book.php

public function tableB() {
  return $this->belongsTo(TableB::class);
}

然后,在 eloquent builder 上,您可以使用它with来检索与每个相关联booksTableB记录book

$books = Book::whereHas('tableB', function($query) {
  $query->where('id', ...); // this is a query that will put a constraint of which results are returned. Adjust according to your necessity
})->get();

推荐阅读