首页 > 解决方案 > 是否使用外键?

问题描述

我有一个名为“反馈”的表,其中包含 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');
    }

标签: phplaravel

解决方案


当然,您可以收到使用 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

因此,如果您在刀片文件中使用$feedbacksin 循环:

 @foreach($feedbacks as $feedback)
    {{ $feedback->eleve->email }} 
 @endforeach

推荐阅读