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

时间:2014-09-22 11:31:59

标签: php laravel laravel-4 count eloquent

我对订单和产品有多对多的关系。

<?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');
    }

 }
?>

需要获取每个产品的订购次数。在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

以上查询的结果如下: -

id  description   count(products.id)    
 1     Shoes          3
 2     Bag            2
 3     Sun glasses    2
 4     Shirt          2

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

4 个答案:

答案 0 :(得分: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;
}

这将让您充分利用热切加载:

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

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

详细了解Eloquent accessors & mutators

和约dynamic properties,上述访问者模仿的行为。


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

答案 1 :(得分:14)

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

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

$products = Product::withCount('orders')->get();

现在,当您在视图中迭代$ products时,每个检索到的产品记录上都有一个orders_count(或通常只是{resource}_count)列,您只需显示为任何其他列值:

@foreach($products as $product)
    {{ $product->orders_count }} 
@endforeach

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

答案 2 :(得分:3)

如果您已有$ products对象,则可以执行以下操作:

k

或者如果您正在使用预先加载:

$rolecount = $products->roles()->count();

干杯。

答案 3 :(得分:0)

我正在使用Laravel 5.1,我可以通过这样做来实现这一目标

 $photo->posts->count()

Photo模型中的posts方法如下所示

public function posts(){
    return $this->belongsToMany('App\Models\Posts\Post', 'post_photos');
}
相关问题