【问题标题】:Laravel eloquent where returns result only for first element in foreach?Laravel 雄辩的哪里只为 foreach 中的第一个元素返回结果?
【发布时间】:2017-04-16 23:18:18
【问题描述】:

我在 order 和 orderItems 之间有一个简单的hasMany 关系。我要做的是获取类似订单商品的数量。这就是我所做的:

        $orderItems = $order->orderItems();

        $distinctItems = $orderItems->groupBy('item_name')->distinct('item_name')->get();


        foreach($distinctItems as $i){

            $i['count'] = $orderItems->where('item_name', '=', $i->item_name)->count();
        }

        $order['items'] = $distinctItems;

但是,仅返回第一订单商品的计数,而其他商品则返回 0。我不确定为什么会这样。我还检查了 where() 是否为除第一个项目之外的项目返回 null。

感谢您的帮助。

【问题讨论】:

  • 我不确定为什么会这样,但是使用 $i['count'] = $order->orderItems()->where('item_name', '=', $i->item_name)->count(); 而不是 $i['count'] = $orderItems->where('item_name', '=', $i->item_name)->count(); 可以完成这项工作。解释会有所帮助。

标签: php laravel laravel-5 eloquent


【解决方案1】:

试试这个代码。

$cnt = array();

foreach($distinctItems as $i){

            $cnt[$i]['count'] = $orderItems->where('item_name', '=', $i->item_name)->count();

        }

print_r($cnt);

【讨论】:

  • 好吧,没有任何改变,请参阅我上面的评论。
【解决方案2】:

尝试仅使用集合,首先 groupBy item_name,然后在每个项目上添加计数并返回看起来像这样的新集合

$orderItems = $order->orderItems()->get();
$order['items'] = $orderItems->groupBy('item_name')->map(function($item) {
    $i = $item->first();
    $i->count = $item->count();
    return $i;
});

【讨论】:

  • 是的,这更整洁(:
  • :) 总是尝试使用框架的内置功能,它们只是为了帮助我们编写整洁的代码.. :)
猜你喜欢
  • 2023-01-27
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-17
相关资源
最近更新 更多