我创建了一个赞助应用程序,我想在“用户帐户”部分向用户显示他们赞助的所有孩子。我创建了一个数据透视表来保存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服务器版本,可在'= {
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'));
}
我现在没有任何错误,但没有任何内容返回页面。
使用调试栏,这是查询结果:
从
kids
上的kid_user
内部联接kid_user
中选择*。kid_id
= {{1}上的kids
。id
内部联接users
。kid_user
=user_id
。users
其中id
。kids
='kid_user.kid_id'和id
。kid_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();
答案 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();