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

3
我正在尝试在帖子的评论列表中实现授权门。我认为我做对了,因为它可以正常工作。
如果用户是评论的所有者或者是该评论所在 subreddit 的版主,则可以编辑评论。否则,他将无法看到编辑链接(我正在使用 X-Editable 进行内联编辑)。
一切都很顺利,直到我提交新评论时,就会出现以下错误。但是,由于可以在刷新后看到它已经提交到数据库中,所以评论已经提交成功。
“comment_list.blade.php”上未定义变量:isModerator 显然,我需要将 isModerator 变量传递给视图,所以我这样做了。
$isModerator = $post->subreddit->moderators->where('user_id', Auth::id())->exists();

页面加载时出现此错误,整个帖子页面崩溃。

Illuminate\Database\Eloquent\Collection::exists() 方法未定义

位于 PostsController.php 第90行的 CommentController::view_data()

这是我的 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;
} 

视图的编辑部分如下所示。
@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);
}

关系

Comment 模型

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

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

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

Post 模型

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');
}

Moderator Model

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');
}

请发布您的关系。 - mcklayin
ه°†ç¬¬90è،Œوڑ‚و—¶و›´و”¹ن¸؛$isModerator = $ids->moderators()->where('user_id', Auth::id())->first(),然هگژè؟گè،Œdd($moderators)ن»¥وں¥çœ‹ه®ƒوک¯هگ¦ه®‍é™…è؟”ه›‍ن؛†وںگن؛›ه†…ه®¹م€‚ - Tim Lewis
抱歉,应该是 dd($isModerator) 而不是 dd($moderators) - Tim Lewis
@TimLewis 它返回一个像这样的HasMany集合http://pastebin.com/85NHE4hb - 然而,如果我重新添加exists(),它将返回true或false。而且这是在PostsController而不是CommentController中。 - Halnex
它返回什么与“->first()”闭包? - Tim Lewis
显示剩余4条评论
2个回答

1

由于我不知道->exists()的用法,但基本前提是检查当前用户是否是特定SubredditModerator,您可以简单地执行以下操作:

$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.

我仍然收到 Undefined variable: isModerator in comment_list.blade.php 的错误,它出现在这一行 @can('update-comment', [$each_comment, $isModerator]) - Halnex
1
еҝ«йҖҹе°қиҜ•пјҡдҪҝз”Ё->withпјҲ['modList' => $modListпјҢ'isModerator' => $isModerator]пјүд»Јжӣҝй“ҫжҺҘиҝһз»ӯзҡ„->with()гҖӮеҸҰеӨ–пјҢвҖң@canвҖқжҳҜд»Җд№ҲпјҹжҲ‘еңЁж–ҮжЎЈдёӯд№ҹжІЎжңүзңӢеҲ°е®ғ... - Tim Lewis
我认为这样做可以了,我也将 $isModerator 作为变量传递给了 post_this_comment() 方法。现在一切似乎都很顺畅。 - Halnex
当你只想分配真或假时,不必使用三元运算符,只需执行 $isModerator = $check != NULL; 即可。 :) - Joel Hinz
1
很高兴听到这个消息。如果您对函数的作用不确定,可以也查看一下这个页面:http://laravel.com/api/5.1/。如果在搜索栏中输入`Model`或`Eloquent`之类的内容,会显示所有可用类、方法、函数等的详细列表。并且@JoelHinz,是的,这是真的:P 简单胜过可读性,哈哈 - Tim Lewis

0

我认为你的 $isModerator = $ids->moderators()->where('user_id', Auth::id()) 返回了 NULL 而不是集合对象。所以你不能使用 ->exists() 方法。

你尝试过使用 whereHas 或 has 方法代替 ->where('user_id', Auth::id()) 吗?


这也会出现“Call to undefined method Illuminate\Database\Eloquent\Collection::whereHas()”的错误。 - Halnex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接