代码之家  ›  专栏  ›  技术社区  ›  BARNOWL

laravel auth()不允许用户发出post请求

  •  0
  • BARNOWL  · 技术社区  · 6 年前

    用户应该能够为多本书设置评级,它允许用户只为一本书设置评级,而不为任何其他书设置评级。

    问题

    用户无法对 另一本书。但是,另一个用户 可以对同一本书进行评级,但不能对 其他的书。即使用户注销也不行。

    我在用 rateYo laravel-ratable

    我的设置方式,评分 type 默认设置为false,允许用户设置星号并进行评级。

    再一次,一旦用户对任何一本书进行评级,不管是哪一本,评级 类型 设置为true将禁用用户设置星号。

    这是我有的

    下面是html设置的样子

    HTML格式

      <div id="rateYo" data-rateyo-rating="{{  $book->userSumRating or 0}}" data-rateyo-read-only="{{ $book->rated ? 'true' : 'false' }}"></div`>
    

    BookController.php文件

      public function rate(Request $request, $book_id)
        {
    
            $book = Book::find($book_id);
            $rating = $book->ratings()->where('user_id', auth()->user()->id)->first();
    
            if(is_null($rating)){
                $ratings = new Rating();
                $ratings->rating =  $request['rating'];
                $ratings->user_id = auth()->user()->id;
                $ratings->type = Book::RATED;
                $book->ratings()->save($ratings);
    
    
    
                return json_encode($book);
    
            }
            else{
               return response()->json(['status' => 'You already left a review']);
            }
        }
    
        public function show($book_name)
        {
            $books = Book::GetBook($book_name)->get();
    
    
            $data = $books->map(function(Book $book){
    
    
                $book['rated'] =  $book->type; 
    
                return $book;
    
            });
    
            return view('books.show', compact('data', $data));
        }
    

    Book.php文件 (相关代码)默认情况下,如果未设置分级,则type等于false允许用户进行分级,如果设置了分级,则type等于true禁用星型功能/读取模式。

    use Rateable;
    
    const RATED = "true";
    const NOT_RATED = "false";
    
    protected $fillable = [ 'user_id', 'title', 'description'];
    
    protected $appends = ['rated'];
    
    
    public function getRatedAttribute()
    {
        return Rate::where('type',  $this->owl() )->where('user_id', auth()->user()->id )->first();
    }
    
    
    public function owl(){
    
        foreach($this->rate as $rates){
            if ($rates->type != "true"){
                return self::NOT_RATED;
            }
    
        }
        return self::RATED;
    
    }
    
    
    public function rate()
    {   
        return $this->hasMany('App\Rate', 'type', 'user_id');
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Brian Lee    6 年前

    您需要在where子句中添加图书id,以检查用户是否为该特定图书留下了评级。正如你所拥有的,它将找到用户留下的第一个等级 任何 书。

    $constraints = [
        'user_id' => auth()->id(),
        'book_id' => $book_id
    ];
    
    // checks if the user has not left a rating for this particular book
    if ($book->ratings()->where($constraints)->doesntExist()) {
        // create new rating...
    } else {
        // user has already rated this book...
    }
    
        2
  •  0
  •   BARNOWL    6 年前

    我需要把我的书改成下面的样式,谢谢数字把我带到正确的方向

    Book.php文件

    public function getRatedAttribute()
    {
        $this->constraints = [
            'user_id' => auth()->id()
        ];
    
        if(Rating::where($this->constraints)->exists()){
    
            return Rating::where(['type' => self::RATED, 'book_id' => $this->getKey()])->first();
        }else{
            return Rating::where('type' ,self::NOT_RATED)->first();
        }
    
    }