2

Hello I am attempting to create a friend system somewhat like the Facebook where you can add another user as a friend however, once I click the button add friend it gives me this error. Any help will be very much appreciated thank you.

SQLSTATE[HY000]: General error: 1364 Field 'accepted' doesn't have a default value (SQL: insert into friends (friend_id, user_id) values (1, 3))

User.php

<?php

namespace Kermode;

use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'first_name','last_name', 'email', 'password','gender',

    ];


    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    public function getName()
    {
      if ($this->first_name && $this->last_name) {
        return "{$this->first_name} {$this->last_name}";
      }
      if ($this->first_name) {
        return $this->first_name;
      }

      return null;
      }

    public function getNameOrUsername()
      {
        return $this->getName() ?: $this->username;
      }

      public function getFirstNameOrUsername()
      {
        return $this->first_name ?: $this->username;
      }

      public function getAvatarUrl()
        {
          return "https://www.gravatar.com/avatar/{{ md5($this->email) }}
          ?d=mm&s=40";
        }
      public function friendsOfMine()
      {
        return $this->belongsToMany('Kermode\User', 'friends', 'user_id',
        'friend_id');
      }
      public function friendOf()
      {
        return $this->belongsToMany('Kermode\User' , 'friends', 'friend_id'
        , 'user_id');
      }
      public function friends()
      {
        return $this->friendsOfMine()->wherePivot('accepted', true)->get()->
        merge($this->friendOf()->wherePivot('accepted', true)->get());
      }
      public function friendRequests()
      {
        return $this->friendsOfMine()->wherePivot('accepted', false)->get();
      }
      public function friendRequestsPending()
      {
        return $this->friendOf()->wherePivot('accepted', false)->get();
      }
      public function hasFriendRequestPending(User $user)
      {
        return (bool) $this->friendRequestsPending()->where('id', $user->id)->
        count();
      }
      public function hasFriendRequestRecieved(User $user)
      {
        return (bool) $this->friendRequests()->where('id', $user->id)->count();
      }
      public function addFriend(User $user)
      {
        $this->friendOf()->attach($user->id);
      }
      public function acceptFriendRequest(User $user)
      {
        $this->friendRequests()->where('id', $user->id)->first()->pivot->
        update([
          'accepted' => true,
        ]);
      }
      public function isFriendsWith(User $user)
      {
        return (bool) $this->friends()->where('id', $user->id)->count();
      }
}

FriendController.php

<?php

namespace Kermode\Http\Controllers;

use Auth;
use Kermode\User;
use Illuminate\Http\Request;

class FriendController extends Controller
{
  public function getIndex()
  {
    $friends = Auth::user()->friends();
    $requests = Auth::user()->friendRequests();

    return view('friends.index')
      ->with('friends', $friends)
      ->with('requests', $requests);
  }

  public function getAdd($first_name)
  {
    $user = User::where('first_name', $first_name)->first();

    if (!$user) {
      return redirect()
        ->route('home')
        ->with('info', 'That user could not be found');
    }

    if (Auth::user()->hasFriendRequestPending($user) || $user->
        hasFriendRequestPending(Auth::user())) {
          return redirect()
            ->route('profile.index', ['first_name' => $user->first_name])
            ->with('info', 'Friend request already pending.');

    }

    if (Auth::user()->isFriendsWith($user)) {
        return redirect()
        ->route('profile.index', ['first_name' => $user->firstname])
        ->with('info', 'You are already friends');

    }

    Auth::user()->addFriend($user);

    return redirect()
      ->route('profile.index', ['first_name' => $first_name])
      ->with('info', 'Friend request sent.');

  }
}

profile.index.blade.php

@extends('layouts.app')

@section('content')
  <div class="row">
    <div class="col-leg-6">
      <h3>Your friends</h3>
        @if (!$friends->count())
            <p>You have no friends</p>
        @else
            @foreach ($friends as $user)
              @include('user/partials/userblock')
            @endforeach
        @endif
    </div>
    <div class="col-lg-6">
      <h4>Friend Request</h4>

      @if (!$requests->count())
      <p>You have no friend requests.</p>
      @else
        @foreach ($requests as $user)
          @include('user.partials.userblock')
        @endforeach
      @endif
    </div>
  </div>
@endsection

friendstable

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateFriendsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('friends', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id');
            $table->integer('friend_id');
            $table->boolean('accepted');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('friends');
    }
}
  • show the migration file of your `friends` table – Parth Pandya Jun 27 '18 at 05:15
  • just put it up man –  Jun 28 '18 at 00:17
  • try changing your boolean field to this :- `$table->tinyInteger('accepted')->default(0);` The error is showing because accepted field has no default value. At the time you are submitting form nothing is passed to accepted, so it needs some default value. Ack me if it works in your case and I will write a detailed answer. – Parth Pandya Jun 28 '18 at 05:36

4 Answers4

1

you have to add accepted into $fillable

Babak Asadzadeh
  • 1,207
  • 1
  • 11
  • 21
0

if you didnt add your column name into $fillable in your model, this error occurred

1364 Field 'accepted' doesn't have a default value

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = ['accepted'];
}
saber tabatabaee yazdi
  • 4,404
  • 3
  • 42
  • 58
0

This error might be because of database. The accepted column needs to be nullable or have a default value like

$table->boolean('accepted')->nullable();

or

$table->boolean('accepted')->default(false);
Furkan Ekinci
  • 2,472
  • 3
  • 29
  • 39
Ethirion
  • 177
  • 1
  • 2
  • 10
0

Go and change your accepted column in your database data type to tinyint then change as defined to 0 .. it will work one worked when I figured out this

Ndìritū
  • 1
  • 1