在Laravel中编写foreach循环的更有效方法

时间:2014-04-23 18:18:46

标签: php laravel foreach laravel-4

目前,我的应用程序使用了很多foreach循环来遍历数据库中的数组。

为了让用户访问该页面,无论他们是否有0,1或100个结果,我必须使用三个IF语句来阻止foreach循环中断。此检查仅适用于0和1结果,任何更好的检查都可以正常工作。

我想我会有几个页面来迭代某些数据库结果,并且肯定使用3个IF语句不是最有效的方法吗?

示例:

控制器:

public function getArchived()
    {
        $alert = Alert::with('location')->where('user_id', '=', Auth::user()->id)
                                        ->onlyTrashed()
                                        ->first();
        $this->layout->content = View::make('agents.alert.archived', 
                                             array('alert' => $alert));
    }

查看(缩短):

@if((count($alert) > 1)
    @foreach($alert->alerts as $alert)
        {{ $alert->id }}
    @endforeach
@elseif ((count($alert) > 0)
        {{ $alert->id }}    
@else
    <p>You have no results</p>
@endif

在将数组发送到视图之前,是否可以在控制器上执行检查?任何指导将不胜感激

1 个答案:

答案 0 :(得分:2)

目前您不需要进行这些检查。您正在使用first()来获取单个对象。

我认为您要做的是使用get()来获取已归档警报的集合。

$alerts = Alert::with('location')->where('user_id', '=', Auth::user()->id)
                                    ->onlyTrashed()
                                    ->get();
$this->layout->content = View::make('agents.alert.archived', 
                                         array('alerts' => $alerts));

现在你知道你将收到一个可以迭代的Collection。

    @foreach($alerts as $alert)
        {{ $alert->id }}
    @endforeach
    @if($alerts->empty())
        No Records
    @endif

<强>更新

在Laravel 4.2中,Blade现在支持这种语法:

@forelse($whole as $piece)
    {{ $piece->something }}
@empty
    No Records
@endforelse