Laravel 两表之间的拉威尔雄辩关系

Laravel 两表之间的拉威尔雄辩关系,laravel,Laravel,我有一张表格注意事项。此表的模型为Notice.php 在这个表中,我有注意和id列。 我已从通知表中获取所有通知,并在我的视图中查看。这是我获取所有通知的控制器代码 public function index() { $notice = Notice::orderBy('id','desc')->paginate(5); return view('teacher.notice')->withNotices($notice)); } @foreach($notic

我有一张表格
注意事项
。此表的模型为
Notice.php
在这个表中,我有
注意
id
列。 我已从
通知
表中获取所有通知,并在我的视图中查看。这是我获取所有通知的控制器代码

public function index()
{
    $notice = Notice::orderBy('id','desc')->paginate(5);
    return view('teacher.notice')->withNotices($notice));
}
 @foreach($notices as $notice)
   {{$notice->id}}
   {{ $notice->notices }}
 @endforeach
这是我的视图代码,用于显示所有通知

public function index()
{
    $notice = Notice::orderBy('id','desc')->paginate(5);
    return view('teacher.notice')->withNotices($notice));
}
 @foreach($notices as $notice)
   {{$notice->id}}
   {{ $notice->notices }}
 @endforeach
现在我想在这个
foreach
循环中放置两个按钮。一个是
确认
,另一个是
删除确认
。 为了存储这个
confirmation
数据,我创建了另一个名为
notice\u confirmatied\u student
的表,该表的模型是
noticeConfirmedStudent.php
。此表中有三列:

id
student_id
notice_id
如果学生单击“确认”,则其id和通知id将存储在此表中。我做得很好。但我的问题是,在
foreach
循环中,它同时显示两个按钮(
确认
删除确认
)。如果用户尚未确认此通知,我想显示确认按钮。如果用户已确认该通知,则应显示
删除确认
按钮。 在这里,为了更好地理解,我再次使用按钮将刀片
foreach
循环。下面的代码并不完美,我只是写了这些代码来理解我的问题

@foreach($notices as $notice)
   {{$notice->id}}
   {{ $notice->notices }}
   <?php $student_id= "select student_id from notice_confirmed_student where notice_id=$notice->id"; ?>
   @if ($student_id == $auth::user()->id)
   <button>confirm</button>
   @else
   <button>Remove Confirmation</button>
   @endif
 @endforeach
@foreach($notices as$notice)
{{$notice->id}
{{$notice->notices}
@如果($student\u id==$auth::user()->id)
确认
@否则
删除确认
@恩迪夫
@endforeach

提前感谢。

如果我正确理解了您的问题,您需要检查具有给定id的记录是否存在
通知\u确认\u学生
表,然后检查您的循环。使用您的通知检索已确认的学生

$notice = Notice::with('notice_confirmed_student_or_whatever_your_relation_method_called)')->orderBy('id','desc')->paginate(5);
然后检入循环,若相关属性并不像视图中那个样为空

@if($notice->my_attr && $notice->my_attr->user_id == \Auth::user()->id)
   // do stuff
@else
  // it doesn't has record
@endif

如果我正确理解您的问题,您需要检查具有给定id的记录是否存在
notice\u confirmatied\u student
表,然后检查您的循环。使用您的通知检索已确认的学生

$notice = Notice::with('notice_confirmed_student_or_whatever_your_relation_method_called)')->orderBy('id','desc')->paginate(5);
然后检入循环,若相关属性并不像视图中那个样为空

@if($notice->my_attr && $notice->my_attr->user_id == \Auth::user()->id)
   // do stuff
@else
  // it doesn't has record
@endif

说清楚一点,这里没有什么不对的地方

通知
用户
关系是,而
通知(已确认)\u学生
是数据透视表。所以用户模型应该有关系

public function confirmedNotices()
{
     return $this->belongsToMany(Notice::class, 'notice_confirmed_student')
}
然后在每个循环中,你可以检查

if(in_array($notice-id, Auth::user()->confirmedNotices->pluck('id')->all())) {
     // user confirmed
} else {
    // user not confirmed.
}

说清楚一点,这里没有什么不对的地方

通知
用户
关系是,而
通知(已确认)\u学生
是数据透视表。所以用户模型应该有关系

public function confirmedNotices()
{
     return $this->belongsToMany(Notice::class, 'notice_confirmed_student')
}
然后在每个循环中,你可以检查

if(in_array($notice-id, Auth::user()->confirmedNotices->pluck('id')->all())) {
     // user confirmed
} else {
    // user not confirmed.
}

要检查其是否已确认的
@if
@else
操作员在哪里?是的,我正在寻求帮助以了解if-else条件。您可以看到我的每个循环的最后一部分。要检查其是否已确认的
@if
@else
运算符在哪里?是的,我正在寻求有关if-else条件的帮助。你可以看到我每个循环的最后一部分。实际上我想做的是@foreach($notice as$notice){{{$notice->id}}{{$notice->notices}}@if($student\u id==$auth::user()->id)confirm@else Remove Confirmation@endif@endforeach`我已经更新了我的问题最后一个foreach循环。你能看一下吗?所以我在我的例子中向你展示了如何做到这一点。在这种情况下,您应该检查相关属性是否不为null,以及
student\u id==current\u user\u ud
。另外,在循环中从DB中检索数据也是一件非常糟糕的事情,因为性能原因,您应该按照我向您展示的方式执行,或者使用
join
或任何您喜欢的方法,但不要在循环中执行。在我的示例中,只有1个DB调用,而在你的示例中,有6个DB调用实际上是我想要做的@foreach($notice as$notice){{{$notice->id}}{{$notice->notices}}@if($student\u id==$auth::user()->id)confirm@else Remove Confirmation@endif@endforeach`我已经更新了我的问题最后一个foreach循环。你能看一下吗?所以我在我的例子中向你展示了如何做到这一点。在这种情况下,您应该检查相关属性是否不为null,以及
student\u id==current\u user\u ud
。另外,在循环中从DB中检索数据也是一件非常糟糕的事情,因为性能原因,您应该按照我向您展示的方式执行,或者使用
join
或任何您喜欢的方法,但不要在循环中执行。在我的例子中只有1个DB调用,在你的例子中有6个,这就是我一直在搜索的东西。你像专家一样解决了我的问题。非常感谢你。还有一个问题,我已经尝试了很多来正确地学习雄辩,但我不知道为什么我不能正确地学习这件事。你能给我一些建议或小贴士来正确地学习雄辩吗。我看过很多教程,阅读了laravel.com上的文档。但我还是很软弱。@Fokrule你可以尝试文档和许多博客,但最终没有什么比尝试和错误更好,只是我的建议。这就是我一直在寻找的东西。你像专家一样解决了我的问题。非常感谢你。还有一个问题,我已经尝试了很多来正确地学习雄辩,但我不知道为什么我不能正确地学习这件事。你能给我一些建议或小贴士来正确地学习雄辩吗。我看过很多教程,阅读了laravel.com上的文档。但我还是很软弱。@Fokrule你们可以尝试文档和许多博客,但最终并没有什么比尝试和错误更好,只是我的建议。