Laravel-permission: BadMethodCallException with message 'Call to undefined method Illuminate\Database\Query\Builder::givePermissionTo()'

Created on 13 Apr 2016  路  11Comments  路  Source: spatie/laravel-permission

After successfully assigning users to role, I tried calling the givePermissionTo() method to give my roles permission and I get the above error. I added the HasRole trait to my users model as it says in the README. However I'm not quite sure where to put use Spatie\Permission\Models\Role; and use Spatie\Permission\Models\Permission;Could this be the cause of the error? Thanks

Most helpful comment

When adding the HasRole trait to the User model, the givePermissionTo() isn't part of the Eloquent query-builder chain.

This works:

$user = User::find(4); // returns an instance of \App\User
$user->givePermissionTo('edit posts');
//or
$user->assignRole('moderator');

but this does not:

$user = User::where('email', '[email protected]')->get(); // returns an Eloquent Collection
$user->givePermissionTo('foo');
// or
$user->assignRole('bar');

All 11 comments

I have the same problem...

When adding the HasRole trait to the User model, the givePermissionTo() isn't part of the Eloquent query-builder chain.

This works:

$user = User::find(4); // returns an instance of \App\User
$user->givePermissionTo('edit posts');
//or
$user->assignRole('moderator');

but this does not:

$user = User::where('email', '[email protected]')->get(); // returns an Eloquent Collection
$user->givePermissionTo('foo');
// or
$user->assignRole('bar');

In the example above you could change get() to first() to make it work:

$user = User::where('email', '[email protected]')->first(); //returns instance of User (if a record was found)

And how I can assign to a role a permission?
By applying:
$ Permission = \ App \ Permission :: find ($ request ['idp']);

     $ Roles = \ App \ Role :: find ($ request ['IDR']) -> first ();
     $ Roles -> givePermissionTo ($ permission-> name);

sentence givePermissionTo () attempts to insert the data into the table 'user_has_permissions' being that should insert data into the table 'role_has_permissions'

I solved it by putting Spatie\Permission\Models\Role and Spatie\Permission\Models\Permission on top of the controller I am calling the givePermissionTo() method from. That is I did
use Spatie\Permission\Models\Role; use Spatie\Permission\Models\Permission;

I tried and told me but I throw this error

PDOException in Connection.php line 390: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'role_id' in 'field list'

in Connection.php line 390
at PDO->prepare('insert into `user_has_permissions` (`permission_id`, `role_id`) values (?, ?)') in C:\xampp\htdocs\SystemLaravel2\vendor\laravel\framework\src\Illuminate\Database\Connection.php line 390
at Connection->Illuminate\Database\{closure}(object(MySqlConnection), 'insert into `user_has_permissions` (`permission_id`, `role_id`) values (?, ?)', array('1', '1')) in Connection.php line 648
at Connection->runQueryCallback('insert into `user_has_permissions` (`permission_id`, `role_id`) values (?, ?)', array('1', '1'), object(Closure)) in Connection.php line 611
at Connection->run('insert into `user_has_permissions` (`permission_id`, `role_id`) values (?, ?)', array('1', '1'), object(Closure)) in Connection.php line 391
at Connection->statement('insert into `user_has_permissions` (`permission_id`, `role_id`) values (?, ?)', array('1', '1')) in Connection.php line 347
at Connection->insert('insert into `user_has_permissions` (`permission_id`, `role_id`) values (?, ?)', array('1', '1')) in Builder.php line 1805
at Builder->insert(array(array('role_id' => '1', 'permission_id' => '1'))) in BelongsToMany.php line 898
at BelongsToMany->attach('1', array(), true) in BelongsToMany.php line 558
at BelongsToMany->save(object(Permission)) in HasPermissions.php line 18
at Role->givePermissionTo('crear usuarios') in AuxpermisosController.php line 68
at AuxpermisosController->store(object(Request))
at call_user_func_array(array(object(AuxpermisosController), 'store'), array(object(Request))) in Controller.php line 256
at Controller->callAction('store', array(object(Request))) in ControllerDispatcher.php line 164
at ControllerDispatcher->call(object(AuxpermisosController), object(Route), 'store') in ControllerDispatcher.php line 112
at ControllerDispatcher->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 139
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 103
at Pipeline->then(object(Closure)) in ControllerDispatcher.php line 114
at ControllerDispatcher->callWithinStack(object(AuxpermisosController), object(Route), object(Request), 'store') in ControllerDispatcher.php line 69
at ControllerDispatcher->dispatch(object(Route), object(Request), 'App\Http\Controllers\AuxpermisosController', 'store') in Route.php line 203
at Route->runWithCustomDispatcher(object(Request)) in Route.php line 134
at Route->run(object(Request)) in Router.php line 708
at Router->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 139
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 103
at Pipeline->then(object(Closure)) in Router.php line 710
at Router->runRouteWithinStack(object(Route), object(Request)) in Router.php line 675
at Router->dispatchToRoute(object(Request)) in Router.php line 635
at Router->dispatch(object(Request)) in Kernel.php line 236
at Kernel->Illuminate\Foundation\Http\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 139
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Debugbar.php line 49
at Debugbar->handle(object(Request), object(Closure))
at call_user_func_array(array(object(Debugbar), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in VerifyCsrfToken.php line 50
at VerifyCsrfToken->handle(object(Request), object(Closure))
at call_user_func_array(array(object(VerifyCsrfToken), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in ShareErrorsFromSession.php line 49
at ShareErrorsFromSession->handle(object(Request), object(Closure))
at call_user_func_array(array(object(ShareErrorsFromSession), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in StartSession.php line 62
at StartSession->handle(object(Request), object(Closure))
at call_user_func_array(array(object(StartSession), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in AddQueuedCookiesToResponse.php line 37
at AddQueuedCookiesToResponse->handle(object(Request), object(Closure))
at call_user_func_array(array(object(AddQueuedCookiesToResponse), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in EncryptCookies.php line 59
at EncryptCookies->handle(object(Request), object(Closure))
at call_user_func_array(array(object(EncryptCookies), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in CheckForMaintenanceMode.php line 44
at CheckForMaintenanceMode->handle(object(Request), object(Closure))
at call_user_func_array(array(object(CheckForMaintenanceMode), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 103
at Pipeline->then(object(Closure)) in Kernel.php line 122
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 87
at Kernel->handle(object(Request)) in index.php line 54

@Gonzalo2324 does the user_has_permissions exist? Does it have a role_id column?

Reopen if you're still having troubles.

I have the same error but with "assingRole" using "tinker", I have tried everything. My "user" model has "HasRoles", can create roles without problems, but when I assign it to a user, it gives me the same error. I am about to shoot me in the head.

Closing the loop on this. As @Omazon said in https://github.com/spatie/laravel-permission/issues/305#issuecomment-362651530 the wrong User model was imported.

Add this to your User Model:

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use  Notifiable, HasRoles;
Was this page helpful?
0 / 5 - 0 ratings

Related issues

bhulsman picture bhulsman  路  3Comments

NattananWs picture NattananWs  路  3Comments

vpratfr picture vpratfr  路  4Comments

holymp2006 picture holymp2006  路  4Comments

bbdangar picture bbdangar  路  4Comments