php - 是否使用外键?
问题描述
我有一个名为“反馈”的表,其中包含 5 个字段:
('id', 'user_id', 'instruction', 'description', 'fk_eleve')
管理员可以创建多个录音,这是一个屏幕截图。
在这里,我有一个录音是Menier Jeremy
学生
在我的标题“Eleves”(英语:Student)中,我们可以看到几条录音:
在这里,Menier Jeremy
有喜欢的电子邮件地址test@gmail.com
。
Menier Jeremy
想连接...
目前有 2 个评分标准: - 学生简介和反馈
用户Menier Jeremy
可以看到他的个人资料
但是,当用户想要查看他的“反馈”时。
不幸的是,我收到以下错误消息:
SQLSTATE [42S22]:找不到列:1054 字段字段“电子邮件”在哪里未知(SQL:选择计数(*)作为聚合 fromreturnswhere email=test@gmail.com)
我的电子邮件有问题?
public function index(Request $request)
{
$user = $request->user();
$feedbacks = Feedback::query()
->when($user->hasRole('admin') !== true, function (Builder $query) use ($user) {
$query->where('email', $user->email);
})
->when($request->has('search'), function (Builder $query) use ($request) {
$query->join('eleves', 'feedbacks.fk_eleve', '=', 'eleves.id')
->orderBy('eleves.nom', 'asc')
->where('eleves.nom', 'like', '%'.$request->input('search').'%');
})
->paginate(5);
return view('admin.feedbacks.index', compact('feedbacks'))
->with('display_search', $user->hasRole('admin'));
}
你知道问题出在哪里吗?
十分感谢
编辑代码@Watercayman
当用户Jeremy Menier
连接时,我看到几个录音:
我只需要检索 ID n° 1
public function index(Request $request)
{
$user = $request->user();
$feedbacks = Feedback::query()
->when($user->hasRole('admin') !== true, function (Builder $query) use ($user) {
\Auth::user()->load('feedbacks');
$feedbacksForThisUser = \Auth::user()->feedbacks;
})
->when($request->has('search'), function (Builder $query) use ($request) {
$query->join('eleves', 'feedbacks.fk_eleve', '=', 'eleves.id')->orderBy('eleves.nom', 'asc')->where('eleves.nom','like','%'.$request->input('search').'%');
})
->paginate(5);
return view('admin.feedbacks.index', compact('feedbacks'))
->with('display_search', $user->hasRole('admin'));
}
我的模型用户:
public function feedbacks()
{
return $this->hasMany('App\Feedback', 'user_id', 'id');
}
我的模型反馈
public function user()
{
return $this->belongsTo('App\User', 'id', 'user_id');
}
解决方案
当然,您可以收到使用 FK 提供反馈的用户的电子邮件。但我认为您不需要所有正在使用的查询。我认为你可以让这更简单。因为用户与模型有关系Feedback
(我假设通过Eleve
模型),如果你愿意,你可以使用名称搜索简单地加载关系:
// Note I have removed the query() method you had in your original query
$feedbacks = Feedback::with('eleves', function ($query) use($request)
$query->orderBy('eleves.nom','asc')->where('eleves.nom','like','%'.$request->input('search').'%');
})->paginate(5);
为了简化解释,我where
从查询中删除了 。为了演示,我将在查询之前使用 if 检查 - 如果您愿意,您可以使其更复杂,但这样更容易看到。
就像是:
if($request->has('search'){ do the query above }
else { $feedbacks = Feedback::with('eleves')->paginate(5); }
然后,因为您已经提取了关系,所以您可以从任何eleves
已加载的电子邮件中获取电子邮件:
$feedback->first()->eleve->email
因此,如果您在刀片文件中使用$feedbacks
in 循环:
@foreach($feedbacks as $feedback)
{{ $feedback->eleve->email }}
@endforeach
推荐阅读
- javascript - React 组件覆盖内部渲染
- azure-sql-database - 行级安全性未按预期工作
- c# - Registry.CurrentUser.CreateSubKey 没有创建任何子键?
- javascript - 用javascript计算程序
- javascript - 从数组中选择 5 个随机字母
- php - Laravel,使用多态表获取数据在删除后不更新
- java - Maven 检索到不期望的 jar
- class - 如何在其他类中运行 JavaFX Window
- r - (-1)^k 对于 R 中从 0 到 9 的每个 k
- sql - 合并两个表,包括在其他表中未找到的行,替换列中的值