是否使用外键?

时间:2019-08-21 14:09:33

标签: php laravel

我有一个名为“ Feedbacks”的表,其中包含5个字段:

('id', 'user_id', 'instruction', 'description', 'fk_eleve')

管理员可以创建多个录音,这是屏幕截图。

在这里,我有一个录音Menier Jeremy是学生

enter image description here

在我的专栏“ Eleves”(英语:Student)中,我们可以看到几张唱片:

在这里,Menier Jeremy就像电子邮件地址test@gmail.com

enter image description here

Menier Jeremy要连接...

enter image description here

目前有2个专栏: -学生档案和反馈

enter image description here

用户Menier Jeremy可以看到他的个人资料

enter image description here

但是,当用户希望看到他的“反馈”时。

不幸的是,我收到以下错误消息:

  

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时,我看到几条记录:

enter image description here

我只需要检索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');
    }

2 个答案:

答案 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()已自动加载。