【问题标题】:More efficient way to write foreach loops in Laravel在 Laravel 中编写 foreach 循环的更有效方法
【发布时间】:2014-06-08 18:05:20
【问题描述】:

目前,我的应用程序使用很多 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

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

【问题讨论】:

  • 您使用first()-函数。你总是只得到一个结果,不是吗?请显示更多代码!
  • 你还需要什么代码才能看到@Fuzzyma?

标签: php laravel foreach laravel-4


【解决方案1】:

目前您不需要进行这些检查。您正在使用 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));

现在您知道您将收到一个可以迭代的集合。

    @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

【讨论】:

  • 嗨@Drew Lewis,感谢您的回复。这很有意义。该错误现在出现在访问 foreach 循环中的关系时,例如:{{ $alert->location->address_1}}。我知道这是正确的,因为它确实适用于前面的 ->first() 不正确的语句。一个alert 属于location
  • ErrorException - 试图获取非对象的属性,它在 foreach - {{ $alert-&gt;location-&gt;address_1}} 内的这条线上。
  • @Svengali 确保每个警报都有一个位置
  • 他们肯定都这样做。就像我说的,当我使用 ->first() 时,它成功检索了每个警报的位置,我不确定为什么它现在会改变?
  • 现在尝试访问与警报相关的messages 也是一样的。每条消息都属于一个警报(通过外键)。 $alert-&gt;messages-&gt;count() 现在也失败了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
  • 2021-11-18
  • 2017-06-23
  • 1970-01-01
  • 2015-12-20
  • 2012-10-20
  • 1970-01-01
相关资源
最近更新 更多