php - Laravel 5:调用未定义的方法 Illuminate\Database\Eloquent\Collection::exists()

标签 php laravel laravel-5

我正在尝试在帖子的评论列表中实现授权门。我想我已经设法做到了,因为它有效。

如果用户是评论的所有者,或者是发布评论的 subreddit 的版主,则他可以编辑评论。否则,他将看不到编辑链接(我正在使用 X-Editable 的内联编辑)

在我提交新评论之前一切正常,但出现以下错误。但是评论已提交到数据库,因为我可以在刷新时看到它。

Undefined variable: isModerator on comment_list.blade.php

很明显,我需要将 isModerator 变量传递给 View ,所以我这样做了

$isModerator = $post->subreddit->moderators->where('user_id', Auth::id())->exists();

这会在页面加载时引发此错误,整个帖子页面崩溃

Call to undefined method Illuminate\Database\Eloquent\Collection::exists()

CommentController::view_data() in PostsController.php line 90

这是我的 Gate 授权。请注意,update-postupdate-sub 可以正常工作。

public function boot(GateContract $gate)
{
    parent::registerPolicies($gate);

    $gate->define('update-comment', function($user, $comment, $isModerator) {
        if($user->id === $comment->user_id) {
            return true;
        }

        if ($isModerator) {
            return true;
        }
    });

    $gate->define('update-post', function ($user, $post, $isModerator) {
        if ($user->id === $post->subreddit->user->id) {
            return true;
        }

        if ($user->id === $post->user_id) {
            return true;
        }

        if ($isModerator) {
            return true;
        }

        return false;
    });

    $gate->define('update-sub', function($user, $subreddit) {
        if($user->id === $subreddit->user->id) {
            return true;
        }

        return false;
    });
}

CommentController中的view_data()方法

public static function view_data(Request $request, Post $post) {
    $instance = new Self;
    $per_page = session('per_page')?session('per_page'):config('constants.per_page');
    $post = Post::with('user.votes')->with('subreddit.moderators')->with('comments')->where('id', $post->id)->first();
    $comment = $post->comments;
    $user = User::where('id', '=', Auth::id())->get();
    
    $isModerator = $post->subreddit->moderators->where('user_id', Auth::id())->exists();
    
    $result['per_page'] = $per_page;
    $result['comments'] = $instance->comment_list($per_page, $request, $post, $comment, $user, $isModerator);
    $result['total_comments'] = $instance->total_comments($post);
    return $result;
} 

View 的编辑部分如下所示

@can('update-comment', [$each_comment, $isModerator])
    <p>
        <a href="#" class="testedit" data-pk="{{ $each_comment->id }}" data-url="{{ url($each_comment->post_id . '/comment/update') }}">
            {!! $each_comment->comment !!}
        </a>
    </p>
@else
        <p>
            {!! $each_comment->comment !!}
        </p>
@endcan

这是 PostsController 中的 show() 方法

public function show(Post $post, User $user, Request $request, Comment $comment)
{
    $post = Post::with('user.votes')->with('subreddit.moderators')->findOrFail($post->id);
    $ids = $post->subreddit;
    $isModerator = $ids->moderators()->where('user_id', Auth::id())->exists(); // this is line 90
    $modList = Moderator::where('subreddit_id', '=', $post->subreddit->id)->get();
    $view_data = CommentController::view_data($request, $post, $comment, $isModerator);

    return view('post/show', $view_data)->with('post', $post)
                            ->with('modList', $modList)
                            ->with('isModerator', $isModerator);
}

关系

注释模型

public function posts() {
    return $this->belongsTo('App\Post');
}

public function user() {
    return $this->belongsTo('App\User');
}

public function commentvotes() {
    return $this->hasMany('App\CommentVote');
}

发布模型

public function user() {
    return $this->belongsTo('App\User');
}

public function subreddit() {
    return $this->belongsTo('App\Subreddit');
}

public function votes() {
    return $this->hasMany('App\Vote');
}

public function moderators() {
    return $this->hasMany('App\Moderator');
}

public function comments() {
    return $this->hasMany('App\Comment');
}

Subreddit 模型

public function user() {
    return $this->belongsTo('App\User');
}

public function posts() {
    return $this->hasMany('App\Post');
}

public function moderators() {
    return $this->hasMany('App\Moderator');
}

主持人 模特

public function subreddit() {
    return $this->belongsTo('App\Subreddit');
}

public function user() {
    return $this->belongsTo('App\User', 'user_id');
}

public function posts() {
    return $this->belongsTo('App\Post');
}

最佳答案

因为我不知道->exists()的用法, 但基本前提只是检查当前用户是否为 Moderator具体的 Subreddit ,您只需执行以下操作:

$check = $ids->moderators()->where('user_id', Auth::id())->first();
$isModerator = $check != NULL ? true : false;
// If $check doesn't return NULL (ie returns a Moderator object) then you are a moderator.

关于php - Laravel 5:调用未定义的方法 Illuminate\Database\Eloquent\Collection::exists(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33288916/

相关文章:

php - 如何使用 Laravel 迁移更新值?

Laravel FFMPEG 视频转换无需等待队列

laravel-5 - 在 Laravel 中保存与更新

twitter-bootstrap - 如何在 Laravel 模板中使用 Bootstrap

php - 用ipv6划分子网

php - Prestashop 产品功能 PHP SQL

php - 如何测试此类或将其重写为可测试的? php规范

javascript - 如何删除 select php foreach 结果中的重复项

laravel - 错误 : OpenSSL SSL_read: SSL_ERROR_SYSCALL, 错误号 10054

laravel-5 - Laravel中的蛋糕php烘焙功能