[英]Call to undefined method Illuminate\Database\Eloquent\Collection::save() laravel
[英]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-post
和update-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()
的用法,但基本前提只是檢查當前用戶是否是特定Subreddit
的Moderator
,您可以簡單地執行以下操作:
$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.