为什么没有在大会上出现下一次注册?

时间:2018-05-04 23:11:03

标签: php laravel

我有一个具有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>

2 个答案:

答案 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