如何在数据库查询中使用数据透视表输出结果?拉拉韦尔

时间:2019-01-16 20:40:21

标签: php mysql laravel

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

我正在使用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'));
}

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

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

  

kids上的kid_user内部联接kid_user中选择*。kid_id =   {{1}上的kidsid内部联接userskid_user = user_idusers   其中idkids ='kid_user.kid_id'和idkid_user = 1


更新2

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

user_id

但是,如果我使用 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 ,则会出错。视图中没有名字。

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

$kids = $user->kids()->get();

1 个答案:

答案 0 :(得分:1)

型号:

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();