View Full Version : مشاهده همه پست های مربوط به یک category خاص با Eloquent در لاراول
saeid4x
شنبه 23 تیر 1397, 07:55 صبح
سلام من دارم روی یک طراحی یک وبلاگ خیلی ساده کار می کنم.دو جدول به نام post و category دارم که فیلداش مثل زیر است:(این دو جدول رابطه many2many دارد)
جدول post
id:increment
author:string
.....
جدول category
id:increment
title:string
.....
جدول category_post یا همون pivot table
id:increment
post_id:integer
category_id:integer
.....
و کد مدل ها :
post.php
public function category()
{
return $this->belongsToMany(Category::class);
}
category.php
public function post()
{
return $this->belongsToMany(post::class)
}
حالا می خوام همه پست های یک category خاص را بگیرم باید از چه کدی تو کنترلر و ویو استفاده کنم؟
plague
شنبه 23 تیر 1397, 16:38 عصر
تیبل های پست و کتگوری اصلا به هم مرتبطس نیستن به شکل مستقیم که شما براشن رابطه نوشتی
شما باید اول تیبل post رو وصل کنی به تیبل category_post و بعد category_post رو وصل کنی به category
توی مدل post
function CategoryPost(){
return $this->hasMany('App\CategoryPost');
}
بعد کوئریش میشه
$category_ids = [1,2,3];
Post::whereHas('CategoryPost' , function($q) use ($category_ids) {
return $q->whereIn('category_id' , $category_ids );
})-get();
saeid4x
شنبه 23 تیر 1397, 20:12 عصر
تیبل های پست و کتگوری اصلا به هم مرتبطس نیستن به شکل مستقیم که شما براشن رابطه نوشتی
شما باید اول تیبل post رو وصل کنی به تیبل category_post و بعد category_post رو وصل کنی به category
توی مدل post
function CategoryPost(){
return $this->hasMany('App\CategoryPost');
}
بعد کوئریش میشه
$category_ids = [1,2,3];
Post::whereHas('CategoryPost' , function($q) use ($category_ids) {
return $q->whereIn('category_id' , $category_ids );
})-get();
ببین کدی که من نوشتم مشکلی نداره و تو tinker به درستی جواب می ده. چون لاراول یک سری قرارداد داره که نیازی نیست به طور صریح جداول رو به هم مرتبط کنی(تو رابطه های many2may) .در ضمن من تو مدل post رابطه تعریف کردم دیگه!.
public function category(){return $this->belongsToMany(Category::class);}
من کد زیر رو تو کنترلر نوشتم:
public function show($cat)
{
$category=category::with('posts')->where('title','=','پادکست')->get();
return view('Posts.show',compact('category'));
}
با کد زیر تو ویو می خوام از طریق رابطه ای که category با post داره، عنوان پست به علاوه عنوان دسته بندی پست و نویسنده و ..و را مثل زیر نمایش بدم:
@foreach($category as $cat)
<p>{{$cat->posts->title}}
@endforeach
اما موقع اجرا میگه که title رو نمیشناسم
saeid4x
شنبه 23 تیر 1397, 21:14 عصر
جوابم رو گرفتم ..اینجا میزارم شاید کسی لازمش شد
باید از دوتا حلقه استفاده کنیم:
@foreach($category as $cat)
@foreach($cat->posts as $post)
{{ $post->title }}
@endforeach
@endforeach
masoud 578
دوشنبه 19 شهریور 1397, 18:52 عصر
راه حلتون درسته اما بهتره این چیزارو داخل ویو استفاده نکنین و در کل کوئری هارو داخل همون کنترلر بزنین. این راه حل یه مقدار deprecated هست
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.