Это поможет вам начать. Вы будете использовать возможности моделей Eloquent и взаимосвязей для выполнения всей логики доступа к данным, тогда вы сможете манипулировать значением read
в коллекции на уровне PHP.
class Comment extends Model
{
public function replies()
{
return $this->hasMany(Reply::class);
}
}
class Reply extends Model
{
public function reply()
{
return $this->belongsTo(Comment::class);
}
}
class CommentController
{
public function index()
{
$comments = Comment::with('replies')->get()
->map(function($comment) {
$comment->read = $comment->replies->pluck('is_read')->filter(function($reply) {
// This will leave only replies that are false
return ! $reply;
})
return $comment;
});
// You could do a return view('comments', compact('comments)); here to return the comments to a blade file for output
return $comments;
}
}
As @muhammad-dyas-yaskur указал, что вы можете установить атрибут read
в модели комментариев, чтобы избежать этого в контроллере, как я это сделал. Подробнее об этом в документации: https://laravel.com/docs/5.8/eloquent-serialization#appending-values-to-json
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ На самом деле я не проверял логику, которая устанавливает атрибут read
. Это может не сработать в первый раз, но основная концепция поможет вам двигаться в правильном направлении.
Гораздо лучший подход к установке свойства read
может быть следующим:
$comment->read = (bool) $comment->replies->where('is_read', false)->count();
Я могутакже указывайте неверное значение true / false для вашей $comment->read
собственности. Вы можете переключить это, вставив восклицательный знак:
$comment->read = (bool) ! $comment->replies->where('is_read', false)->count();