2015-09-11 18 views
6

Tôi bị kẹt ở đây đã cố gắng từ 2-3 giờ.laravel 5.1 nhận được 5 tin tức liên quan của từng loại trong quan hệ nhiều-nhiều-nhiều

Tôi có một nhiều với nhiều mối quan hệ:

class Category extends Model 
{ 
    public function news() 
    { 
     return $this->belongsToMany('App\News'); 
    } 
} 

class News extends Model 
{ 
    public function categories() 
    { 
     return $this->belongsToMany('App\Category'); 
    } 
} 

tôi đang cố gắng để có được mới nhất 5 tin tức về các loại liên quan:

$front_categories = Category::with(array(
     'news'=>function($query){ 
     $query->where('publish','1')->orderBy('created_at', 'desc')->take(5);})) 
     ->where('in_front', 1)->get(); 

Các truy vấn trên không hoạt động đối với tôi nó đưa ra một tổng cộng năm kết quả thay vì 5 kết quả cho mỗi danh mục.

Trả lời

1

Dựa trên những gì tôi biết về Laravel, bạn có thể thử làm theo cách này thay thế.

class Category { 

    public function recentNews() 
    { 
     return $this->news()->orderBy('created_by', 'DESC') 
          ->take(5); 
    } 
} 

// Get your categories 
$front_categories = Category::where('in_front', 1)->get(); 

// load the recent news for each category, this will be lazy loaded 
// inside any loop that it's used in. 
foreach ($front_categories as $category) { 
    $category->recentNews; 
} 

Điều này có cùng tác dụng như câu trả lời của Lê Trần Tiến Trung và kết quả trong nhiều truy vấn. Nó cũng phụ thuộc vào nếu bạn đang sử dụng lại chức năng này hay không. Nếu nó là một lần duy nhất, nó có thể là tốt hơn để đặt này ở một nơi khác. Các cách khác cũng có thể năng động hơn, chẳng hạn như tạo ra một phương thức trả về bộ sưu tập các loại và bạn có thể yêu cầu nó cho một số lượng nhất định:

class CategoriesRepository { 

    public static function getFrontCategories(array $opts = []) { 

     $categories = Category::where('in_front', 1)->get(); 

     if (!empty($opts) && isset($opts['withNewsCount'])) 
     { 
      foreach ($categories as $category) 
      { 
       $category->recentNews = static::getRecentNewsForCategory(
        $category->id, 
        $opts['withNewsCount'] 
       ); 
      } 
     } 

     return $categories; 
    } 
} 

$front_categories = CategoriesRepository::getFrontCategories([ 
    'withNewsCount' => 5 
]); 
0

Tôi nghĩ, Vì bạn mong muốn tải một bộ sưu tập có nhiều hơn một bản ghi.

Để giải quyết nó, bạn cần phải lặp

$front_categories = Category::where('in_front', 1)->get(); 

foreach ($front_categories as $fCategory) { 
    $fCategory->load(['news' => function($query) { 
     $query->where('publish','1')->orderBy('created_at', 'desc')->take(5); 
    }]); 
} 

Giải pháp này sẽ làm nhiều truy vấn để DB. Nếu bạn chỉ muốn thực hiện một truy vấn, hãy thanh toán số này Using LIMIT within GROUP BY to get N results per group?

+0

những gì tôi đã làm là $ front_categories = Thể loại :: nơi ('in_front ', 1) -> orderBy (' position ',' asc ') -> get(); trong danh mục mô hình tin tức chức năng công cộngTop5() { trả lại $ this-> news() -> orderBy ('created_at', 'desc') -> take (5); } và trong lưỡi của tôi @foreach ($ front_category-> newsTop5 dưới dạng tin tức $) – sanu

Các vấn đề liên quan