2015-09-08 3 views
2

HI Это мой первый проект в Laravel 5.1. Я застрял в Laravel многие ко многим отношения, пожалуйста, помогите У меня есть таблицы, какlaravel 5.1 many to many relation

новости

ид | название | Содержание

категории

идентификатор | название | cat_type

и сводную таблицу

category_news

идентификатор | category_id | news_id

и модели

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

class Category extends Model 
{ 
    public function news() { 

    return $this->belongsToMany('App\News'); 

    } 
} 

как я получаю все новости cat_type = 1 с ним ы, связанные с категорией

пожалуйста, помогите

Я попытался

$news = News::whereHas('categories', 
      function($query){  
       $query->where('cat_type','2');  
      }) 
      ->where('publish','1') 
      ->orderBy('created_at', 'desc') 
      ->take(5) 
      ->get();//latest news 

он дает новости, но не rela Ted категория пожалуйста, помогите спасибо

ответ

1

Вы также можете использовать жадную загрузку для ваших нужд.

В этом случае, все, что вам нужно сделать, это написать что-то вроде следующего:

$categoryAndNews = Category::with('news')->where('cat_type',2)->first(); 

Можно также определить ограничения в контексте отношений.

$categoryAndNews = Category::with(['news' => function($query){ 
    $query->orderBy('created_at', 'desc') 
    ->take(5); 
}])->get(); 

Надеюсь, это будет полезно!

Более подробно о теме здесь: http://laravel.com/docs/5.1/eloquent-relationships#constraining-eager-loads

+0

Francesco Malatesta да, но orderBy не работает – sanu

+0

Можете уточнить? :) У меня нет элементов, которые помогут вам в противном случае ... Какая ошибка вы получаете? _orderBy_ просто пропущен? Используется метод _take() _? –

+0

Да, действительно, что случилось: 1) если новость относится к нескольким категориям, она будет показывать одни и те же новости несколько раз. 2) порядок новостей не работает. - – sanu

0

Вы можете запросить категорию первым, как

$category = Category::where('cat_type',2)->first(); 
$news = $category->news()->where->where('publish','1') 
     ->orderBy('created_at', 'desc') 
     ->take(5) 
     ->get(); 
+0

Абдул Басит это будет просто дать новости одной категории – sanu

+0

Для нескольких категорий, вы можете заменить первый(), то получите() и дополнить («новости») до Это. $ news = Category :: with (['news' => function ($ query) { $ query-> orderBy ('created_at', 'desc'); }]) -> get(); –

+0

это правильно $ category = Category :: where ('cat_type', 2) -> get(); $ news = Category :: with (['news' => function ($ query) {$ query-> orderBy ('created_at', 'desc');}]) -> get(); – sanu