php - 如何在数据库查询中使用数据透视表输出结果?拉拉维尔
问题描述
我创建了一个赞助应用程序,在用户帐户部分,我想向用户展示他们赞助的所有孩子。我创建了一个数据透视表来保存用户和孩子之间的关系。
我有 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 服务器版本相对应的手册,以获取在 '= 附近使用的正确语法
kids
。id
= ?' 在第 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
kids
inner joinkid_user
onkid_user
。kid_id
=kids
。id
内连接users
上kid_user
。user_id
=users
。id
哪里kids
。id
= '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
解决方案
楷模:
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();
推荐阅读
- html - 在 iPhone8、iPhone11 上显示透明背景的引导模式
- functional-interface - 功能接口在 Eclipse 中给出错误
- angular - 无法预测 Angular 中扫描仪或键盘的输入
- javascript - D3 Charting Tool:如何在柱形图中的目标线(附加水平线)右侧添加标签
- ubuntu - k8 在 bazel info local_cpu_resources 的输出中意味着什么
- java - 如何在 Android 的 TextView 和 EditText 中显示来自 API 服务器的 JSON 数据?
- python - 如何编写for循环来查找Python中每一行的多列中存在或不存在的特定数字?
- php - 从值创建数组键。我已经创建了数组定义到波纹管。我区分了实际结果和预期结果
- javascript - Chrome滚动条占用空间,但在样式化之前是不可见的
- android - 如何在 Android 的 OnTextChange 侦听器中验证 DOB?