簡體   English   中英

Laravel 5:調用未定義的方法Illuminate \\ Database \\ Eloquent \\ Collection :: exists()

[英]Laravel 5: Call to undefined method Illuminate\Database\Eloquent\Collection::exists()

我正在嘗試在帖子的評論列表上實現授權門。 我想我已經設法做到了,因為它有效。

如果用戶是評論的所有者,或者是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;
    });
}

所述view_data()在方法CommentController

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模型

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()的用法,但基本前提只是檢查當前用戶是否是特定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.

我認為你$isModerator = $ids->moderators()->where('user_id', Auth::id())返回NULL而不是集合對象。所以你不能使用->exists()方法。 您是否嘗試使用whereHas \\ has方法而不是->where('user_id', Auth::id())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM