【问题标题】:Min and Max value in Laravel bladeLaravel刀片中的最小值和最大值
【发布时间】:2017-01-03 14:06:49
【问题描述】:

我的刀片视图中有一个表格,如下所示(我只去掉了 tr 和 td 部分):

@foreach ($event->offers as $offer)
    <tr>
        <td class="text-center"><a href="/offers/{{ $offer->id }}">{{ $offer->user->company }}</a></td>
        <td class="text-center">{{ $offer->created_at }}</td>
        <td class="text-center"><span class="btn btn-default">{{ $offer->netto }} €</span></td>
    </tr>
@endforeach

我想要的是相应地更改引导 btn 类的最小值和最大值,但仅限于这两个值!

我找到了一个原生 php 函数 min() 和 max()

http://php.net/manual/en/function.min.php

但我不知道如何使用刀片和 foreach 循环来实现它。

【问题讨论】:

标签: php twitter-bootstrap laravel


【解决方案1】:

第一种方法sortBy()收集并使用the loop variable。它只会显示一次最小值和最大值:

@foreach ($event->offers->sortBy('netto') as $offer)
    ....
    <td class="text-center"><span class="btn btn-default {{ $loop->first ? 'minClass'  : '' }}{{ $loop->last ? 'maxClass'  : '' }}">{{ $offer->netto }} €</span>
@endforeach

第二种方式有点难看,但即使有多个相同的最小值或最大值,它也会只显示一次最小值和最大值。使用 min()max() 助手:

<?php $min = $event->offers->min('netto');
      $max = $event->offers->max('netto');
      $minShown = false;
      $maxShown = false; ?>

@foreach ($event->offers as $offer)
    ....

    {{-- Show min class only once --}}
    <?php $minClass = ''; $maxCalss = ''; ?>
    @if (!$minShown && $offer->netto == $min)
        <?php $minShown = true; $class = 'minClass' ?>
    @endif

    {{-- Show max class only once --}}
    @if (!$maxShown && $offer->netto == $max)
        <?php $maxShown = true; $class = 'maxClass' ?>
    @endif

    <span class="btn btn-default {{ $class }}">{{ $offer->netto }} €</span>
@endforeach

【讨论】:

  • 只是这对我来说不是很清楚......sortBy('netto')这里的netto是什么?它需要属性 $offer->netto 还是什么?
  • 是的,它需要一些属性并按此属性排序集合。这是来自文档的描述:sortBy 方法按给定键对集合进行排序。排序后的集合保留了原始数组键,因此在本例中,我们将使用 values 方法将键重置为连续编号的索引
  • 有效!只是如果有人想知道 sortBy() 函数按升序排序 >>>
  • 是的,我想你想把它从最小值排序到最大值,所以我使用了sortBy()。但是你也可以使用sortByDesc()。很高兴它有帮助。 )
  • 对我来说,如何排序并不重要,但要获得最小和最大网络...现在一切正常,多亏了你,这不是你第一次帮助我。
【解决方案2】:

选项 1

如果满足条件,这会添加额外的类(使用三元 if):

{{ $offer->netto == $event->offers->max('netto') ? 'ADDITIONAL CLASS' : '' }}

这样插入:

<td class="text-center"><span class="btn btn-default {{ $offer->netto == $event->offers->max('netto') ? 'ADDITIONAL CLASS' : '' }}">{{ $offer->netto }} €</span></td>

它不是最优化的代码,因为它会在每次迭代中执行->max()。但是您可以从这里开始进行优化(将最大值保存在变量中等......)。 ->min()也可以这样做

选项 2:

不过,您可能需要这样的东西。这假设您将根据 netto 的最大/最小值更改“btn-default”类:

<td class="text-center">
    <span 
        @if($offer->netto == $event->offers->max('netto'))
        class="btn btn-max">
        @elseif($offer->netto == $event->offers->min('netto'))
        class="btn btn-min">
        @else
        class="btn btn-default">
        @endif
        {{ $offer->netto }} €
    </span>
</td>

【讨论】:

  • 好的,你给了我一个想法......如果我在我的 Offer 模型中创建 2 个函数(最大值和最小值)会更好,我的意思是更优化和更快?
  • 我认为这不是最好的解决方案。模型的实例不会知道它放置的集合。它基本上无法知道它是否是最小/最大。一种方法是在查询时按报价的“netto”对报价进行排序(尽管您可能不希望这样)。另一种方法是在控制器中设置$maxNetto$minNetto 并将其传递给视图。然后在视图中查看$offer-&gt;netto == $maxNetto
  • 模型的实例会知道,因为模型是相关的,我可以调用 $event->offers 并且它会返回集合......所以让我们尝试做一些事情......我的意思是让我们尝试为这个问题找到最好的解决方案,以便其他人也可以学习。
  • 我们怎样才能通过这个对话来聊天?我知道当有很多 cmet 时会弹出一个链接,把这个对话用来聊天....我们可以马上做吗?
  • 我不确定。我会在接下来的 20 分钟内离开。我仍然不确定您将如何在模型中做到这一点:D 但我很高兴看到您的解决方案。顺便说一句,如果优化对您来说非常重要 - 让您渴望加载您在视图中调用的所有关系。具体来说:$offer-&gt;user-&gt;company 在 foreach 中。确保您像这样加载您的活动:$event = Event::with('offers.user') 或前一部分将为每个优惠调用额外的查询。
猜你喜欢
  • 1970-01-01
  • 2012-08-27
  • 2018-12-23
  • 2017-07-09
  • 2023-04-02
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多