Laravel集团采用Elequent模型

时间:2017-03-10 15:13:49

标签: laravel eloquent

我正在与Laravel和Eloquent ORM合作,在为我的桌子开发控制器,模型和视图后,我需要提取agregate信息,但我不知道这是最好的方法还是最干净的" Laravel& #34;这样做的方法。

我有一个db ,就像这个例子:

Schema::create('order_items', function (Blueprint $table) {
        $table->increments('id');
        $table->timestamps();
        $table->integer('order_id')->unsigned();
        $table->foreign('order_id')->references('id')->on('orders')->onDelete('cascade');
        $table->string('item_description');
        $table->integer('item_qty');
        $table->status('item_status');
    });

详细信息数据可以是:

2   2017-02-28 12:48:07 2017-02-28 12:48:31 1   ProductB    2   NEW
4   2017-02-28 12:48:17 2017-02-28 12:48:17 1   ProductC    3   NEW
29  2017-03-10 10:49:47 2017-03-10 10:49:47 1   ProductC    23  CLOSED
40  2017-03-10 10:49:47 2017-03-10 10:49:47 1   ProductB    2   SHIPPED
1   2017-02-28 11:04:28 2017-02-28 11:29:10 3   ProductA    1   NEW
28  2017-03-10 10:49:47 2017-03-10 10:49:47 3   ProductB    22  CLOSED
39  2017-03-10 10:49:47 2017-03-10 10:49:47 3   ProductA    1   SHIPPED
5   2017-02-28 14:36:54 2017-02-28 14:36:54 6   ProductD    4   NEW
6   2017-02-28 14:37:01 2017-02-28 14:37:01 6   ProductD    5   NEW
30  2017-03-10 10:49:47 2017-03-10 10:49:47 6   ProductD    24  CLOSED
41  2017-03-10 10:49:47 2017-03-10 10:49:47 6   ProductC    3   SHIPPED

控制器中,我使用了范围

public function home()
{
  $onlynew = Orderitem::onlynew ();
  return view('home', compact('onlynew '));
}

模型

public function scopeonlynew ($query) {
return \DB::select('SELECT item_description, sum(item_qty) qty 
                    FROM   order_items 
                    WHERE item_status = ? 
                    GROUP BY item_description',['NEW']);
}

在视图中,我可以这种方式访问​​数据

<div class="row">
 <ul>
  @foreach ($onlynew as $newitem)
   <li>{{$newitem->item_description}} - {{$newitem->qty}}</li>
  @endforeach
 </ul>
</div>

是否可以使用类似以下示例的语法,或者对于此类查询,框架不允许使用构建器?

return $query->where('item_status', '=', 'NEW')
         ->sum('item_qty')
         ->groupBy('item_description')
         ->orderBy('item_description');

感谢您提供任何帮助或建议。

2 个答案:

答案 0 :(得分:2)

当您使用sum()方法时,它会执行查询并仅返回总和。你想要的是得到总和和描述,所以你必须自己构建选择。这就是&#34; Laravel&#34;方式可能看起来像。

控制器:

public function home()
{
    $onlynew = Orderitem::onlyNew()->get();
    return view('home', compact('onlynew '));
}

型号:

public function scopeOnlyNew($query) 
{
    return $query->where('item_status', '=', 'NEW')
        ->selectRaw('sum(item_qty) as qty, item_description')
        ->groupBy('item_description')
        ->orderBy('item_description');
}

请注意,查询范围的构建方式略有不同。 Query scopes are designed to allow you to group commonly use query constraints into a single method然后将这些约束重新用于您正在构建的任何查询。它们应始终返回与给定的查询对象相同的查询对象,而不是创建像DB::select()这样的新查询对象。

答案 1 :(得分:0)

我个人更喜欢使用DB :: table语句。

public function scopeonlynew () {
    return DB::table('order_items')->where('item_status', '=','NEW')->get();
}

请告诉我这是否适合您!