laravel Принадлежит к многим страницам - PullRequest
0 голосов
/ 17 марта 2020

у меня есть 2 модели

1 - категория с родителем и дочерним элементом

class Category extends Model
{


protected $primaryKey = 'id';
public $fillable = ['slug','title','icon','parent_id'];
/**
 * Get the index name for the model.
 *
 * @return string
*/
public function childs() {
    return $this->hasMany('App\Category','parent_id','id') ;
}
public function parent()
{
    return $this->belongsTo('App\Category', 'parent_id','id');
}
public function posts(){

    return $this->belongsToMany('App\Post', 'category_post');
}
public function latestposts(){

    return $this->belongsToMany('App\Post', 'category_post')->latest()->limit(3);
}


}

2 - модель поста с принадлежащим ToMany-> Категория

class Post extends Model 
{

protected $primaryKey = 'id';
public $fillable = ['user_id','slug','title','excerpt','content','keyword','img','status'];

protected $table = 'posts';


public function cat_posts(){
    return $this->belongsToMany('App\Category', 'category_post');

}


}

пример дерева данных :

1-category parent 

 |- 1-child category -> with 5 post

 |- 2-child category -> with 3 post

Теперь при просмотре основного раздела -> (родительская категория) я хочу отобразить все сообщения во всех детских категориях. В результате количество сообщений = 8 * 1012. *

И по нумерации страниц Как я могу это сделать

1 Ответ

0 голосов
/ 17 марта 2020

сначала вам нужно сделать запрос, чтобы получить все subcategory из вашего основного category

. В этом примере, я полагаю, что первая категория является главной категорией

$subsCat = Category::first()->childs->pluck('id');

после этого вы можете получить все продукты с этими категориями id

Post::whereIn('category_post', $subsCat)->paginate(8);

, и если вам не нужно разбивать на страницы, вы можете сделать это в одну строку, используя each из laravel collection как этот

$cat->childs->each(function($child){ 
   $child->posts;
})

Вы можете прочитать больше о каждый и гдеIn из документов

Первый Пример с paginate более эффективен, потому что он сделает только два запроса

...