【问题标题】:Laravel 5: Querying a many to many relationship without "pivot" in the resultLaravel 5:查询结果中没有“枢轴”的多对多关系
【发布时间】:2019-01-14 20:59:13
【问题描述】:

我有以下表格

  • 用户
    • 身份证
  • 书籍
    • 身份证
  • 最喜欢的书
    • 身份证
    • user_id (FK)
    • book_id (FK)

我有以下型号:

class User {
    public function favouriteBooks()
    {
        return $this->belongsToMany(Book::class, 'favourite_books');
    }
}

我想获取属于某个用户的所有 id。

我目前这样做的方式是这样的:

$user->favouriteBooks()->select('book_id')->get();

但是这会返回这样的数据;

[
   {
     "book_id": 23,
     "pivot": {
       "user_id": 57,
       "book_id": 23
     }
   },
   {
     "book_id": 41,
     "pivot": {
       "user_id": 57,
       "book_id": 41
     }
   },
   ...
]

我希望它像这样返回数据:

[
   23,
   41,
   ...
]

我该怎么做?

【问题讨论】:

    标签: laravel laravel-5


    【解决方案1】:

    我建议像在 user.php 中一样将枢轴放在隐藏数组中:

    protected $hidden = ['pivot'];
    

    这将从所有返回的 json 中删除枢轴。

    【讨论】:

    • 对于一个小型应用程序来说没问题,但如果您需要在一个查询中包含数据透视数据怎么办?您需要重建所有其他查询以隐藏数据透视数据并测试每一个?
    • 我认为你是对的,也许最好的做法是使用转换器,并且在不需要时不包括枢轴
    • @HazemEmad 感谢您的回答,但请修正美元符号的位置。它应该在“隐藏”之前,而不是在“保护”之前。
    • 感谢您的通知
    • 只有当我在 Books 类中添加它时它才对我有用。我叫 User->favouriteBooks
    【解决方案2】:

    使用pluck() 方法:

    $user->favouriteBooks()->pluck('book_id');
    

    【讨论】:

    • 太棒了。我建议保留->select('book_id'),因为从数据库传输到服务器的数据较少
    • 不知道是谁干的或为什么干的
    • 为什么?它有什么作用?请在您的答案中添加详细信息。
    【解决方案3】:

    或者:

    $user = User::where('id',1)->with('favourite_books')->first();
    $fbs = [];
    foreach($user->favourite_books as $book) {
        $fbs[] = $book['book_id'];
    }
    unset($user->favourite_books);
    $user->favourite_books = $fbs;
    
    return $user;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-12
      • 1970-01-01
      • 1970-01-01
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 2020-07-15
      相关资源
      最近更新 更多