我正在与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');
感谢您提供任何帮助或建议。
答案 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();
}
请告诉我这是否适合您!