首页 > 解决方案 > 如何在数据库查询中使用数据透视表输出结果?拉拉维尔

问题描述

我创建了一个赞助应用程序,在用户帐户部分,我想向用户展示他们赞助的所有孩子。我创建了一个数据透视表来保存用户和孩子之间的关系。

我有 3 张桌子正在使用:

+---------------------+
| Tables_in_Database  |
+---------------------+
| kid_user            |
| kids                |
| users               |
+---------------------+

+-----------------------------+
|        users table          |
+----+------------+-----------+
| id | first_name | last_name |
+----+------------+-----------+
|  1 | John       | Smith     |
|  2 | Sally      | Doe       |
+----+------------+-----------+

+-----------------------------+
|        kids table           |
+----+------------+-----------+
| id | first_name | last_name |
+----+------------+-----------+
|  1 | Bobby      | Little    |
+----+------------+-----------+
|  2 | Sam        | Little    |
+----+------------+-----------+

+-----------------------+
|   kid_user table      |
+----+--------+---------+
| id | kid_id | user_id |
+----+--------+---------+
|  1 |      1 |       1 | Kid: Bobby | User: John
|  2 |      1 |       1 | Kid: Bobby | User: John
|  3 |      2 |       2 | Kid: Sam   | User: Sally
+----+--------+---------+

我要将他们赞助的孩子输出到用户帐户页面。(由于赞助名额,用户可以多次赞助同一个孩子)

这是我收到的错误:

SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 '= 附近使用的正确语法kidsid= ?' 在第 1 行

用于输出结果的控制器逻辑:

  public function sponsoring() {
    $kids = DB::table('kids')
    ->join('kid_user','kid_user.kid_id', 'kids.id')        
    ->join('users','kid_user.user_id', 'user.id')        
    ->where('kids.id', '=', 'kid_user.kid_id' && 'kid_user.user_id', '=', auth()->id()) 
    ->get();
  return view('profile.sponsoring.index',['user' => Auth::user()], compact('kids'));
}

在我的孩子模型中:

  public function users() {
        return $this->belongsToMany(User::class)->withTimestamps();
  }

在我的用户模型中:

public function kids()
{
    return $this->belongsToMany(Kid::class)->withTimestamps();
}

在我看来:

@foreach ($kids as $kid)
    <p>You are currently sponsoring {{ $kid->first_name }} {{ $kid->last_name }}</p>
@endforeach

我敢肯定,我做这件事比现在困难得多,但是在阅读了文档、SO 和 Google 之后,我仍然感到困惑。


更新 我将查询修复为以下内容:

public function sponsoring() {
$kids = DB::table('kids')
->join('kid_user','kid_user.kid_id', 'kids.id')        
->join('users','kid_user.user_id', 'users.id')        
->where('kids.id', '=', 'kid_user.kid_id')->where('kid_user.user_id', '=', auth()->id()) 
->get();
    return view('profile.sponsoring.index',['user' => Auth::user()], compact('kids'));
}

我现在没有收到任何错误,但我没有收到任何返回到页面的内容。

使用调试栏这是查询结果:

select * from kidsinner join kid_useron kid_userkid_id= kidsid内连接userskid_useruser_id= usersid 哪里kidsid= 'kid_user.kid_id' 和kid_user. user_id= 1


更新 2

我可以像这样检索一个孩子的结果:

        public function sponsoring() {
$user = User::find(Auth::user()->id);
$kids = $user->kids()->first();
return view('profile.sponsoring.index',['user' => Auth::user(), 'kids' => compact('kids')]);
        }

@foreach ($kids as $kid)
    <p>You are currently sponsoring {{ $kid->first_name }} {{ $kid->last_name }}</p>
@endforeach

但是如果我使用$kids = $user->kids()->get();它会出错。视图中没有名字。

最终正确答案:使用 Dito Khelaia 逻辑......

        public function sponsoring() {
$user = User::find(Auth::user()->id);
return view('profile.sponsoring.index',['user' => Auth::user()]);
        }
// In View:
@foreach ($user->kids as $kids)
    <p>You are currently sponsoring {{ $kids->first_name }} {{ $kids->last_name }}</p>
@endforeach

标签: phpmysqllaravel

解决方案


楷模:

class User
{
    public function kids()
    {
       return $this->belongsToMany(Kid::class);
    }
}
class Kid
{
    public function users()
    {
        return $this->belongsToMany(User::class);
    }
}

检索记录:

$user = User::find(Auth::user()->id);
$user->kids();

推荐阅读