在laravel雄辩中从数据透视表中获取数量

dev*_*r34 6 php count laravel eloquent laravel-4

我对订单和产品有很多关系.

<?php
class Order extends Eloquent {

    public function user()
    {
        return $this->belongsTo('User');
    }

    public function products()
    {
        return $this->belongsToMany('Product');
    }
 }
 ?>


<?php
class Product extends Eloquent {

    public function orders()
    {
        return $this->belongsToMany('Order');
    }

 }
?>
Run Code Online (Sandbox Code Playgroud)

需要获取每个产品的订购次数.在mysql中,可以使用以下查询来完成此任务

SELECT products.id, products.description, count( products.id )
FROM products
INNER JOIN order_product ON products.id = order_product.product_id
INNER JOIN orders ON orders.id = order_product.order_id
GROUP BY product_id
LIMIT 0 , 30
Run Code Online (Sandbox Code Playgroud)

以上查询的结果如下: -

id  description   count(products.id)    
 1     Shoes          3
 2     Bag            2
 3     Sun glasses    2
 4     Shirt          2
Run Code Online (Sandbox Code Playgroud)

如何使用laravel eloquent(不使用查询构建器)实现此任务????如何使用laravel eloquent获取每个产品的订购次数?

Jar*_*zyk 20

介意在引擎盖下Eloquent使用Query\Builder,所以在Laravel中没有这样的东西,比如'不使用查询构建器的查询口才'.

这就是你需要的:

// additional helper relation for the count
public function ordersCount()
{
    return $this->belongsToMany('Order')
        ->selectRaw('count(orders.id) as aggregate')
        ->groupBy('pivot_product_id');
}

// accessor for easier fetching the count
public function getOrdersCountAttribute()
{
    if ( ! array_key_exists('ordersCount', $this->relations)) $this->load('ordersCount');

    $related = $this->getRelation('ordersCount')->first();

    return ($related) ? $related->aggregate : 0;
}
Run Code Online (Sandbox Code Playgroud)

这将让您充分利用加载:

$products = Product::with('ordersCount')->get();

// then for each product you can call it like this
$products->first()->ordersCount; // thanks to the accessor
Run Code Online (Sandbox Code Playgroud)

阅读更多关于Eloquent访问者和变异者的信息,

关于动态属性,上述访问者模仿的行为.


当然,您可以使用简单连接来获得与示例中完全相同的查询.


小智 16

对于未来的观众,从Laravel 5.2开始,有一些本机功能可以在不加载资源模型或访问者的情况下计算关系而无需加载它们 -

在批准的答案中的示例的上下文中,您将放置在您的控制器中:

$products = Product::withCount('orders')->get();
Run Code Online (Sandbox Code Playgroud)

现在,当您在视图上遍历$ products时,每个检索到的产品记录上都有一个orders_count(或通常只是一个{resource}_count)列,您可以像显示任何其他列值一样显示该列:

@foreach($products as $product)
    {{ $product->orders_count }} 
@endforeach
Run Code Online (Sandbox Code Playgroud)

对于相同的结果,此方法产生的数据库查询少于批准的方法,并且唯一的模型参与是确保正确设置关系.如果你现在使用L5.2 +,我会使用这个解决方案.