2015-09-11 28 views
6

Utknąłem tutaj próbując od 2-3 godzin.laravel 5.1 uzyskiwanie powiązanych 5 wiadomości z każdej kategorii w relacjach wiele do wielu

Mam wiele do wielu relacji:

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

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

próbuję uzyskać najnowszy 5 wiadomości o kategorie:

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

Powyższe zapytanie nie działa dla mnie to daje łącznie pięć wyników zamiast 5 wyników dla każdej kategorii.

Odpowiedz

1

Na podstawie tego, co wiem o Laravel, możesz spróbować zrobić to w ten sposób.

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; 
} 

Ma to taki sam efekt, jak odpowiedź Lê Trần Tiến Trung i powoduje wiele zapytań. To zależy również od tego, czy korzystasz z tej funkcji, czy nie. Jeśli jest to jednorazowe, może lepiej umieścić to gdzie indziej. Inne sposoby mogą być również bardziej dynamiczne, takie jak tworzenie metodę, która zwraca kolekcję kategoriach i można poprosić go o pewnej liczbie:

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

Wydaje mi się, że bardzo zależy Ci na załadowaniu kolekcji, która ma więcej niż jeden rekord.

Aby go rozwiązać, trzeba pętla

$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); 
    }]); 
} 

rozwiązanie to robić wiele zapytań do DB. Jeśli chcesz zrobić tylko jedną kwerendę, wymień to na Using LIMIT within GROUP BY to get N results per group?

+0

co zrobiłem jest $ front_categories = kategoria :: where ('in_front ', 1) -> orderBy ("pozycja", "asc") -> get(); w mojej kategorii model public function newsTop5() { return $ this-> news() -> orderBy ('created_at', 'desc') -> take (5); } i moim ostrzem @ foreach ($ front_category-> newsTop5 jako nowości) – sanu