我有一个具有index()方法的UserController,该方法应该由用户获得会议中的所有注册,并且每次注册都会获得会议详细信息(标题和日期)。因此,可以在视图“users.index”中显示所有用户注册的会议标题,日期和注册日期。
会议表有一个列“end_congress_date”,如果“end_congress_date”仍在过去,则意味着大会尚未结束,否则意味着大会已经结束..
但是没有效果,没有结果出现。你知道为什么吗?
所以我有索引(),如:
class UserController extends Controller
{
public function index(){
$user = Auth::user();
$registrations = $user->registrations()->with('congress')->get();
return view('users.index', compact('user','registrations'));
}
}
“dd($registrations);
”显示:
Collection {#281 ▼
#items: array:17 [▼
0 => Registration {#287 ▶}
1 => Registration {#288 ▶}
2 => Registration {#289 ▶}
]
}
index.blade.php:
<ul class="list-group congresses-list" id="">
@foreach($registrations->where('congress_end_date', '<=', \Carbon\Carbon::now()) as $reg)
<li class="list-group-item">
<p class="font-size-sm"><i class="fa fa-calendar" aria-hidden="true"></i>
{{$reg->congress->congress_start_date->formatLocalized('%a, %b %d, %Y - %H:%M')}}</p>
<h5 class="card-title">{{$reg->congress->name}}</h5>
<p> Registration done in {{$reg->created_at}}</p>
</li>
@endforeach
</ul>
答案 0 :(得分:0)
问题是你正试图对一些不存在的东西进行循环:
@foreach($registrations->where('congress_end_date', '<=', \Carbon\Carbon::now()) as $reg)
注册对象上不存在congress_end_date
字段,它存在于关系:congress上。因此,if-check(如果日期小于现在)将在100%的时间内失败。因此......在users.index页面上不会显示任何注册。
你有一些选择,你可以通过国会从数据库中提取(假设你有关系回到注册),或者最简单的就是像你一样循环注册$,但是从foreach中删除日期检查循环并在下面的会议模型上添加if检查。像这样的事情(假设国会关系并不多):
@foreach($registrations as $registration)
if($registration->congress->congress_end_date < \Carbon\Carbon::now()))
// do what you want with the congress model that hasn't ended yet here
希望这有帮助
答案 1 :(得分:0)
我建议在Congress
模型上添加一个或两个辅助方法,告诉你国会是否已经结束。我希望知道这是整个应用程序中的常见要求。
class Congress
{
// other code
public function isFinished(): bool
{
return $this->congress_end_date < now();
}
}
(这需要你对模型进行$dates = ['congress_end_date', ...]
演员。)
然后,您可以使用集合中的filter()
方法检索已经完成的Registrations
的所有Congress
(或者相反):
@foreach($registrations->filter(function ($item) { return $item->congress->isFinished(); }) as $reg)
// do something with the registrations of finished congresses
@endforeach
[可选:仅当您不需要所有注册,但只需完成注册时]
如果您不打算使用$registrations
中的所有项目,只考虑已完成大会的项目,我建议您只获取所需的项目。您可以通过交换
$registrations = $user->registrations()->with('congress')->get();
支持
$registrations = $user->registrations()
->with('congress')
->whereHas(['congress' => function ($query) {
$query->where('congress_end_date', '<', now());
}])
->get();
然后您可以在视图中简单地遍历它们而不进行过滤:
@foreach($registrations as $reg)
// ...
@endforeach