سلام
من یک سیستم کامنت با قابلیت ریپلای ایجاد کردم
وقتی کاربر کامنت خودش رو ارسال میکنه در سایت نمایش داده نمیشه و فقط ادمین باید اون کامنت رو تایید کنه تا در سایت نمایش داده بشه
تا اینجا مشکلی نیس
ولی وقتی به یک کامنتی ریپلای داده میشه(توسط هر کاربری) اون ریپلای بدون تایید ادمین در سایت نمایش داده میشه
مشکل از کجاس؟
کنترلر پست متود show
public function show(Post $post)
{
$count = $post->comments()->count();
$comments = $post->comments()->where('approved',true)->get();
return view('site/post/show',compact('post','comments','count'));
}
کنترلر کامنت
public function store(Request $request,Post $post)
{
$this->validate($request,[
'website' => 'nullable|active_url',
'comment' => 'required|min:۵'
]);
$comment = new Comment();
$comment->user_id = Auth::user()->id;
$comment->name = Auth::user()->fname;
$comment->email = Auth::user()->email;
$comment->website = $request->website;
$comment->body = $request->comment;
$post->comments()->save($comment);
Session::flash('success', 'Comment Send Successfully');
return back();
}
public function reply(Request $request,Comment $comment)
{
$this->validate($request,[
'website' => 'nullable|active_url',
'replyComment' => 'required|min:۵'
]);
$reply = new Comment();
$reply->user_id = Auth::user()->id;
$reply->name = Auth::user()->fname;
$reply->email = Auth::user()->email;
$reply->website = $request->website;
$reply->body = $request->replyComment;
$comment->comments()->save($reply);
Session::flash('success', 'Comment Replyed Successfully');
return back();
}
مدل کامنت
protected $fillable = [
'parent_id', 'user_id', 'post_id', 'name', 'email', 'website', 'body', 'approved'
];
public function user()
{
return $this->belongsTo(User::class);
}
public function post()
{
return $this->belongsTo(Post::class);
}
public function commentable()
{
return $this->morphTo();
}
public function comments()
{
return $this->morphMany(Comment::class,'commentable');
}
مدل پست
use Sluggable;
protected $fillable = [
'title','slug', 'body', 'views', 'category_id', 'user_id'
];
public function user()
{
return $this->belongsTo(User::class);
}
public function categories()
{
return $this->belongsToMany(Category::class,'post_category');
}
public function tags()
{
return $this->belongsToMany(Tag::class);
}
public function comments()
{
return $this->morphMany(Comment::class,'commentable');
}
مایگریشن کامنت
Schema::create('comments', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('user_id')->default(۰);
$table->string('name');
$table->string('email');
$table->string('website')->nullable();
$table->text('body');
$table->boolean('approved')->default(false);
$table->unsignedInteger('commentable_id');
$table->string('commentable_type');
$table->timestamps();
});
چند روزه درگیره اینم نمیدونم چیکار کنم!(
مرسی
کد زیر
@foreach($comment->comments as $reply)
میشه به این شکل
@foreach($comment->comments()->where('approved' , 1)->get() as $reply)
بدلیل اینکه زمانی که در view میخواید کامنت های فرزند رو هم با رابطه برگردونید باید از یک where استفاده کنید تا فقط فرزندانی که approved اون true هست رو براتون برگردونه
شما کد اون قسمتی که فرزندن های یک کامنت رو بر میگردونید قرار بدید تا بگم به چه شکلیه داستان .
<div class="single-comment">
<div class="media">
<div class="media-left text-center">
<img class="media-object" src="/assets/images/reply-1.jpg" alt="">
</div>
<div class="media-body">
<div class="media-heading">
<h3 class="text-uppercase">
{{ $comment->name }}
<a href="#" class="pull-right reply-btn" data-toggle="modal"
data-target="#replyModal{{ $comment->id }}">reply</a>
</h3>
</div>
<p class="comment-date">
{{ $comment->created_at }}
</p>
<p class="comment-p">
{{ $comment->body }}
</p>
</div>
</div>
</div>
@foreach($comment->comments as $reply)
<div class="single-comment single-comment-reply">
<div class="media">
<div class="media-left text-center">
<img class="media-object" src="/assets/images/reply-2.jpg" alt="">
</div>
<div class="media-body">
<div class="media-heading">
<h3 class="text-uppercase">{{ $reply->name }}</h3>
</div>
<p class="comment-date">
{{ $reply->created_at }}
</p>
<p class="comment-p">
{{ $reply->body }}
</p>
</div>
</div>
</div>
@endforeach```
کد زیر
@foreach($comment->comments as $reply)
میشه به این شکل
@foreach($comment->comments()->where('approved' , 1)->get() as $reply)
خیلی زیاد پیشنهاد میکنم از
global scope
استفاده کنی
https://laravel.com/docs/5.6/eloquent#global-scopes
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟