Laravel: Показать родительское значение на основе значений дочерних таблиц - PullRequest
0 голосов
/ 22 декабря 2019

В моем приложении laravel я сталкиваюсь с ситуацией, когда мне нужно показать список записей в формате сетки. Однако один из столбцов, называемый read, зависит от количества записей дочерней таблицы.

Таблицы:

comments:
    id, user_id, comment, post_date

comment_replies:
    id, comment_id, reply, is_read (default false)

Если comment_repliesСтолбец is_read таблицы имеет хотя бы одно значение false, тогда столбец сетки read должен иметь значение unread, иначе "читать" для соответствующей записи.

Мой текущий код

class Comment extends Model
{
    public function index()
    {
        # fetching data
        $modelSelf = self::select([
            "comments.id",
            "comments.user_id",
            "comments.comment",
            "comments.post_date"
        ])
        ->paginate(15)
        ->map(function($comment) {
            $comment->read = ($comment->reply->where('is_read', false)->count() > 0)
                ? 'Unread'
                : 'Read';

            return $comment;
        });

        # return
        return !($modelSelf->isEmpty())
            ? $modelSelf
            : null;
    }
}

Правильно ли я делаю это или есть какой-нибудь способ сделать это??
Может ли это быть сделано через отношения ..?

1 Ответ

1 голос
/ 22 декабря 2019

Это поможет вам начать. Вы будете использовать возможности моделей 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...