我有一个名为“ Feedbacks”的表,其中包含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字段字段'email'未知,其中(SQL:选择count(*)作为返回值,其中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');
}
答案 0 :(得分:1)
当然,您可以获取使用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
因此,如果您在 blade 文件中循环使用$feedbacks
:
@foreach($feedbacks as $feedback)
{{ $feedback->eleve->email }}
@endforeach
答案 1 :(得分:1)
好的,我认为由于进行了编辑,因此该问题与最初提出的问题完全不同,因此我将添加另一个答案,而不是尝试在评论中传达这个问题。
我想您是在问,当用户尝试查看他的feedbacks
时,您会遇到SQL错误。如果用户正在选择反馈选项,则可能只有单个用户正在寻找自己的feedbacks
。我建议您将查询更改为反向查询(从用户处拉feedbacks
,而不是拉出所有feedbacks
,然后让用户匹配):
\Auth::user()->load('feedbacks');
$feedbacksForThisUser = \Auth::user()->feedbacks;
或者,如果您想获得另一个用户的feedbacks
(并且该用户有权查看他们),只需查询该用户:
$user = User::with('feedbacks')->find($idOfUserYouWantToSee);
$feedbacks = $user->feedbacks;
如果您想从具有特定名称的用户中搜索feedbacks
,同样的事情也会发生:
$user = User::with('feedbacks')->where('nom','like','%'.$request->input('search').'%')->first();
$feedbacksForSearchedUser = $user->feedbacks;
关键是忘记电子邮件-关系将把所有feedbacks
链接到用户。您无需加入或查询电子邮件。您始终将其放在$user
对象上。 (即$user->email
将始终有效)。
如果您想从所有用户那里看到全部feedbacks
,这实际上并不困难,只需查询所有用户并渴望加载feedbacks
关系即可:
$users = User::with("feedbacks")->get();
然后用刀片服务器
@foreach($users as $user)
// If you want to display only a special set of users to the Auth::User(), then do an if-check here
@if(\Auth::user()->hasPerm("someperm") && $user->isInSomeCategory)
@foreach($user->feedbacks as $feedback)
{{ $feedback->text // or whatever the field you want to show }}
@endforeach
@endif // The if check is totally optional in this - just giving you an example
@endforeach
编辑:显示一个简单的index()
public function index(Request $request)
{
if(!\Auth::user()->hasRole('admin')) {
\Auth::user()->load('feedbacks');
$feedback = \Auth::user()->feedbacks;
}
elseif($request->has('search')) {
$user = User::with('feedbacks')->where('nom','like','%'.$request->input('search').'%')->first();
$feedbacks = $user->feedbacks;
}
return view('admin.feedbacks.index', compact('feedbacks'));
}
注意:为使此过程尽可能简单,我还删除了:
->with('display_search', $user->hasRole('admin'));
您可以在“刀片”页面上进行检查,因为\Auth::user()
已自动加载。