2015-09-11 7 views
6

Ich steckte hier wurde versucht von 2-3 Stunden.Laravel 5.1 bekommen 5 Nachrichten von jeder Kategorie in Viele-zu-viele-Beziehung

Ich habe viele, viele Beziehung:

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

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

I neuesten 5 Nachrichten der entsprechenden Kategorien zu bekommen versuche:

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

Die obige Abfrage ist für mich nicht geben eine Arbeits Insgesamt fünf Ergebnisse anstelle von 5 Ergebnissen für jede Kategorie.

Antwort

1

Basierend auf dem, was ich über Laravel weiß, könnten Sie es stattdessen auf diese Weise versuchen.

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

Dies hat die gleiche Wirkung wie Lê Trần Tiến Trung Antwort und die Ergebnisse in mehreren Abfragen. Es hängt auch davon ab, ob Sie diese Funktionalität wiederverwenden oder nicht. Wenn es sich um eine einmalige Sache handelt, ist es vielleicht besser, sie woanders hinzustellen. Andere Möglichkeiten könnten auch dynamischer, sein wie ein Verfahren zu schaffen, die die Sammlung von Kategorien gibt und Sie können es für eine bestimmte Anzahl fragen:

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

Ich denke, weil Sie eifrig laden eine Sammlung, die mehr als einen Datensatz hat.

es zu lösen, müssen Sie Schleife

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

Diese Lösung wird viele Anfragen an die DB tun. Wenn Sie nur mit 1 Abfrage arbeiten möchten, gehen Sie bitte auf Using LIMIT within GROUP BY to get N results per group?

+0

was ich tat, ist $ front_categories = Kategorie :: wo ('in_front ', 1) -> orderBy (' position ',' asc ') -> get(); in meiner Kategorie Modell öffentliche Funktion newsTop5() { zurück $ this-> news() -> orderBy ('erstellt_at', 'desc') -> take (5); } und in meiner Klinge @foreach ($ front_category-> newsTop5 as $ news) – sanu