【问题标题】:Relationship with three tables in laravellaravel中与三个表的关系
【发布时间】:2021-01-27 08:05:19
【问题描述】:

我需要帮助才能从我的数据库中获取数据。我有以下型号:

-User
--Id
--Name

-Book
--Id
--Name

-List
--Id
--Title

-BookList
--id
--List
--Book
--User

我正在使用 eloquent,我希望按照以下结构获取数据:

-User
--List 1
--- Book 1
--- Book 2
--List 2
--- Book 1
--- Book 3

换句话说,一个拥有多个书籍列表的用户。在 User.php 模型中我做了如下关系:

public function lists ()
{
  return $ this-> belongsToMany (
    List :: class, // related
    'books_lists', // table
    'user', // foreign pivot key
    'list' // related pivot key
  );
}

public function books ()
{
   return $ this-> belongsToMany (
      Book :: class, // related
      'books_lists', // table
      'user', // foreign pivot key
      'book' // related pivot key
   );
}

这样我得到以下回报:

-User
--List 1
--List 2
--Book 1
--Book 3

我需要做什么样的关系才能获得所需结构的数据?

谢谢。

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    最好的结构是合并列表和书单表(因为每个书单都只能有一个标题)

    -Users
    --id
    --name
    
    -books
    --id
    --name
    
    -book_list
    --book_id
    --list_id
    
    -lists
    --id
    --title
    --user_id
    

    在User.php中

    public function lists ()
    {
      return $this->hasMany(List::class);
      //no need to define the foreign keys if you name the tables and fields like above
    }
    

    在 List.php 中

    public function books ()
    {
      return $this->belongsToMany(Book::class);
      //no need to define the foreign keys if you name the tables and fields like above
    }
    

    现在你可以用这个得到结果

    $user = User::with('lists.books')->find($userId);
    

    结果如下

    -user
    --List 1
    ---Book 1
    ---Book 2
    --List 2
    ---Book 1
    ---Book 4
    

    【讨论】:

    • 就我而言,同一本书可以添加到不同的列表中,例如,同一用户和不同用户。示例:我(用户 1)最喜欢的图书列表:图书 1 和图书 2,葡萄牙语图书列表(用户 1):图书 1 和图书 3。待售图书列表(用户 2):图书 1...
    【解决方案2】:

    一本书可以添加到多个列表中,对吗?您的数据库结构可以更好,但我假设您的 ERD 是由设计师/领导者修复的。所以就按照我的指示去做吧:

    将此关系添加到用户模型(User.php):

    public function lists ()
    {
      return $this->belongsToMany (
        List::class, // related
        'books_lists', // table
        'user', // foreign pivot key
        'list' // related pivot key
      );
    }
    

    这与列表模型(List.php)的关系:

    public function books ()
    {
       return $this->belongsToMany (
          Book::class, // related
          'books_lists', // table
          'list', // foreign pivot key
          'book' // related pivot key
       )->withPivot(["user"]);
    }
    

    返回

    $user = User::with(['lists.books'=> function($q)use($id){
    $q->wherePivot('user', '=', $id);}])->first();
    dd($user->toArray())
    

    但最好将结构更改为:

    -User
    --Id
    --Name
    
    -Book
    --Id
    --Name
    
    -List
    --Id
    --Title
    
    -BookList
    --id
    --List
    --Book
    
    -UserList
    --List
    --User
    

    【讨论】:

    • 您好,按照您的指示,如何只过滤一个用户?我试过了:public function show($id) { $user = User::where('id', $id)->with('lists.books')->first(); dd($user->toArray()); } 但我两次得到相同的清单,在清单内我得到不适合这个用户的书。如何解决这个问题? Tks
    • 你不能按照我的建议换桌子吗?
    • 第二次更新也没有成功,请看这里的结果:pastebin.com/9DT7BYV0
    • 我认为问题出在你的数据上,你能给我看看你的数据吗?
    • 您好 Muhammad,您的指示受到启发,我可以解决我的问题。我创建了一个新表 UserList 并在用户模型中创建了一个列表方法(belongsToMany),在列表模型中我创建了一个书籍方法(belongsToMany),然后为了获取数据,我在列表控制器中使用以下代码:$data_user = User: :where('id', $user_id)->with(['lists.books' => 函数 ($query) 使用 ($user_id){ $query->where('user_id', $user_id); }]) ->获取();谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多