【问题标题】:laravel get last bid from each postlaravel 从每个帖子中获取最后出价
【发布时间】:2016-10-30 22:00:17
【问题描述】:

我有 2 个表格,Items 和 Bids。

Items hasMany(Bid);

表格项目

  • id-1
  • id-2
  • id-3

表格出价

  • id-1 | 3
  • id-1 | 4
  • id-2 | 2
  • id-2 | 5
  • id-3 | 4
  • id-3 | 6

现在我想显示每个项目的最高出价。

这是我的代码

 $data = PostItem::with([
     'bids' => function($query) {
         $query->orderBy('new_bid','desc')->get();
     }
 ])
 ->get();

但问题是它会接受所有出价。

但是如果我使用这个代码

 $data = PostItem::with([
     'bids' => function($query) {
          $query->orderBy('new_bid','desc')->take(1);
     }
 ])
 ->get();

只取1个最新出价,不要取每件的最新出价。

如何正确操作?

提前致谢

【问题讨论】:

    标签: php mysql laravel laravel-5 laravel-5.3


    【解决方案1】:

    limit() 添加到关系中:

    public function highestBids()
    {
        return $this->hasMany('App\Bid')->orderBy('new_bid', 'desc')->limit(1);
    }
    

    然后得到最高的出价:

    $data = PostItem::with('highestBids')->get();
    

    【讨论】:

    • 结果与我的第二个查询相同
    【解决方案2】:

    您可以将查询编写为:

     $items = PostItem::with(['bids' => function($query){
                        $query->orderBy('new_bid','desc');
                    }])
                    ->get();
    

    现在要获得每个项目的最高出价:

    foreach ($items as $item) {
        $highest_bid = $item->bids->first(); // highest bids of $item
        if($highest_bid) {
           $new_bid = $item->new_bid;
        }
    }
    

    【讨论】:

    • 这个查询是对的,我可以得到最高的出价,但它会产生整个数组,如果写 $item->bids->first()->new_bid 它会出错
    • 是的,但结果是一样的
    • 通过查看$items dd(),可以确定$item->bids 是一个集合,$item->bids->first() 将写入Bid 模型的对象。可能还有其他问题,但上面的代码没有。
    • 我是这么认为的,实际上我之前也做过类似的事情,但是当我复制并粘贴代码时,结果是一样的。你认为我的模型有问题吗?
    • 请记住,这将获得整个 bids 表,这将杀死现实世界应用程序中的请求。所以,只有当这个表总是很小的时候才使用它。
    【解决方案3】:

    您可以使用distinct() 方法获取唯一记录。试试下面的查询。

    $items = PostItem::with(['bids' => function($query){
                 $query->distinct()
                    ->select('item_id')
                    ->orderBy('new_bid','desc')
                    ->groupBy('item_id')
                    ->get();
             }])
             ->get();
    

    【讨论】:

    • 这只会产生一个项目,但我想显示所有项目及其出价。所以我认为我的“出价”查询缺少一些东西
    • 我之前尝试过 distinct 导致“语法错误或访问冲突:1055 表达式”
    【解决方案4】:

    我有答案,但可能不是最佳答案。

    所以我仍然使用我的第一个查询,然后在视图中我使用@foreach。 因为我已经对最高出价进行了排序,所以我添加了@break 来中断 foreach,这样它就不会循环所有结果。

    但我确信有更好的方法来做到这一点

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多