2015-10-22 3 views
2

Я пытаюсь реализовать Authorization Gate в списке комментариев на сообщениях. Я думаю, что мне удалось это исправить, потому что это работает.Laravel 5: вызов неопределенного метода Illuminate Database Eloquent Collection :: exists()

Если пользователь является владельцем комментария или является модератором в subreddit, на который отправлен комментарий, тогда он может его отредактировать. Если нет, он не сможет увидеть ссылку редактирования (я использую встроенное редактирование с X-Editable)

Все работает хорошо, пока я не отправлю новый комментарий, чем я получу следующую ошибку. Но комментарий отправляется в базу данных, потому что я могу увидеть его при обновлении.

Неопределенная переменная: isModerator на comment_list.blade.php

Очевидно, что мне нужно передать isModerator переменную к виду, так что я сделал

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

Это бросает эту ошибку на загрузка страницы, сбои всей страницы

Звонок на неопределенный метод Illum inate \ Database \ красноречивый \ Коллекция :: существует()

CommentController :: view_data() в PostsController.php линии 90

Это мой 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 

И это show() метод PostsController

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

пожалуйста, напишите ваш отношения – mcklayin

+0

Я обновил свой пост. – Halnex

+0

Временно измените строку 90 на '$ isModerator = $ ids-> moderators() -> где ('user_id', Auth :: id()) -> first()' и запустите 'dd ($ moderators)', чтобы увидеть, он фактически что-то возвращает. –

ответ

1

Поскольку я не знаю, использование ->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. 
+0

Я все еще получаю 'Undefined variable: isModerator в comment_list.blade.php', который является этой строкой' @can ('update- comment ', [$ each_comment, $ isModerator]) ' – Halnex

+1

Быстрая вещь, чтобы попробовать:' -> с ([' modList '=> $ modList,' isModerator '=> $ isModerator]) 'вместо цепочки' -> с () 'ы. И что такое '@ can'? Я не вижу этого в документации ... –

+0

Я думаю, что сделал это, я передал '$ isModerator' как переменную в методе post_this_comment()'. Кажется, теперь он щелкнет. – Halnex

0

Я думаю, что вы $isModerator = $ids->moderators()->where('user_id', Auth::id()) возвращать NULL вместо коллекции object.So вы не можете использовать ->exists() метод. Вы пытались использовать whereHas \ методы вместо ->where('user_id', Auth::id())?

+0

Это также дает 'Call to undefined method Illuminate \ Database \ Eloquent \ Collection :: whereHas()' – Halnex

Смежные вопросы