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

Posted

技术标签:

【中文标题】Laravel 5:调用未定义的方法 Illuminate\\Database\\Eloquent\\Collection::exists()【英文标题】:Laravel 5: Call to undefined method Illuminate\Database\Eloquent\Collection::exists()Laravel 5:调用未定义的方法 Illuminate\Database\Eloquent\Collection::exists() 【发布时间】:2016-01-22 04:44:39 【问题描述】:

我正在尝试在帖子的 cmets 列表上实施授权门。我想我已经成功了,因为它有效。

如果用户是评论的所有者,或者是发布评论的子版块的版主,那么他可以对其进行编辑。如果没有,他将无法看到编辑链接(我正在使用带有 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型号

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

【问题讨论】:

请发表您的关系 我已经更新了我的帖子。 将第 90 行临时更改为 $isModerator = $ids-&gt;moderators()-&gt;where('user_id', Auth::id())-&gt;first() 并运行 dd($moderators) 以查看它是否真的返回了一些东西。 对不起,dd($isModerator),不是dd($moderators)。杜尔 @TimLewis 它返回一个HasMany 这样的集合pastebin.com/85NHE4hb - 但是,如果我重新添加exists(),它将返回真或假。这是在PostsController 而不是CommentController 【参考方案1】:

由于我不知道-&gt;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]) 快速尝试:-&gt;with(['modList' =&gt; $modList, 'isModerator' =&gt; $isModerator]) 而不是链接-&gt;with()s。还有@can 是什么?我在文档中也没有看到... 我认为做到了,我也在post_this_comment() 方法中将$isModerator 作为变量传递。这一切似乎现在都点击了。 当你只想分配真或假时,你不必使用三元组,只需执行$isModerator = $check != NULL; 就足够了。 :) 很高兴听到这个消息。如果您对函数的作用有任何疑问,请查看此页面:laravel.com/api/5.1。如果您在搜索栏中输入ModelEloquent 之类的内容,它将显示所有可用类、方法、函数等的详细列表。@JoelHinz 是的,这是真的:P 简单而不是可读性大声笑跨度> 【参考方案2】:

我认为你 $isModerator = $ids-&gt;moderators()-&gt;where('user_id', Auth::id()) 返回 NULL 而不是集合对象。所以你不能使用 -&gt;exists() 方法。 您是否尝试使用 whereHas \ has 方法而不是 -&gt;where('user_id', Auth::id())

【讨论】:

这也给Call to undefined method Illuminate\Database\Eloquent\Collection::whereHas()

以上是关于Laravel 5:调用未定义的方法 Illuminate\Database\Eloquent\Collection::exists()的主要内容,如果未能解决你的问题,请参考以下文章

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

Laravel 5.2 - 调用未定义的方法 Illuminate\Support\Facades\Request::session()

laravel 5.2 调用未定义的方法 Illuminate\Database\Query\Builder::associate()

调用未定义的方法 Maatwebsite\Excel\Facades\Excel::create() - Laravel 5.3

Laravel 5.6:升级 composer.json 后调用未定义的方法 ...\Store::getToken()

在 laravel 5.3 中调用未定义的方法 Illuminate\Database\Query\Builder::attach()