2016-01-28 15 views
0

我在类别和产品模型之间有ManyToMany关系。只抓取X产品模型通过在ManyToMany产品类别关系中的热切加载

产品模式是这样的:

class Product extends Model 
    { 
     protected $primaryKey = 'product_id'; 

     public function categories() 
     { 
      return $this->belongsToMany('App\Category', 'category_product', 'product_id', 'cat_id'); 
     } 
} 

而且分类型号是:

class Category extends Model 
     { 
      protected $primaryKey = 'cat_id'; 

      public function products(){ 
      return $this->belongsToMany('App\Product','category_product','cat_id','product_id'); 
     } 
    } 

现在,我想提取每个类别的只有最后4(例如)产品。为此我写这个:

$categories = Category::with([ 
    'products' => function($query){ 
     $query->select('products.product_id')->orderBy('created_at','desc')->take(4); 
    } 
])->get(); 

但是,这不能正常工作,并返回意外的产品数?

我该怎么做?

+1

你可以试试这个$ categories = Category :: all(); (0) - > take(4) - > get()() - > orderBy('product_id','DESC') - > skip(0) - > ; }更改相关类别模型的类名称。 –

回答

0

如果你想要的产品每个类别的最后一个X号,你可以尝试这样的:

Category::with(['products' => function($query) { 
    $query->orderBy('updated_at','desc')->take(X); 
}])->get(); 

这将返回一个类的集合中,你应该比每类产品所需的数量不多。

希望它有帮助。

+0

我认为这和我自己尝试过的一样。不是吗? –

+0

不完全一样,因为您有多对多关系,回调将在数据透视表(即category_product)上执行。在您的代码中,您试图选择产品表的product_id(即使您可能指的是类别表)。 – shempignon

+0

我尝试了你的代码,并且'拿(2)'返回类似的结果,并且只返回两个类别返回相关的产品。我只从产品中选择'product_id',因为我不需要产品的其他字段。 –