Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SQL Error on Roles Sync or Attach #126

Closed
too-gee opened this issue Apr 12, 2017 · 13 comments
Closed

SQL Error on Roles Sync or Attach #126

too-gee opened this issue Apr 12, 2017 · 13 comments

Comments

@too-gee
Copy link

too-gee commented Apr 12, 2017

I get the following error when syncing or attaching roles:
SQLSTATE[HY000]: General error: 1364 Field 'user_type' doesn't have a default value (SQL: insert into `role_user` (`role_id`, `user_id`) values (2, 68))

I modified my laratrust_setup_tables.php migration file, changing line 27 from
$table->string('user_type');
to
$table->string('user_type')->default('App\User');

as well as changing line 61 from
$table->string('user_type');
to
$table->string('user_type')->default('App\User');

Did I miss something during setup?

@KKSzymanowski
Copy link
Collaborator

You're probably missing some configuration. What is the stack trace of this exception?

@KKSzymanowski
Copy link
Collaborator

If it happens in the command line, you can find the stack trace in storage/logs/*.log.

@too-gee
Copy link
Author

too-gee commented Apr 12, 2017

QueryException in Connection.php line 647:
SQLSTATE[HY000]: General error: 1364 Field 'user_type' doesn't have a default value (SQL: insert into `role_user` (`role_id`, `user_id`) values (2, 62))
in Connection.php line 647
at Connection->runQueryCallback('insert into `role_user` (`role_id`, `user_id`) values (?, ?)', array(2, 62), object(Closure)) in Connection.php line 607
at Connection->run('insert into `role_user` (`role_id`, `user_id`) values (?, ?)', array(2, 62), object(Closure)) in Connection.php line 450
at Connection->statement('insert into `role_user` (`role_id`, `user_id`) values (?, ?)', array(2, 62)) in Connection.php line 404
at Connection->insert('insert into `role_user` (`role_id`, `user_id`) values (?, ?)', array(2, 62)) in Builder.php line 2114
at Builder->insert(array(array('role_id' => 2, 'user_id' => 62))) in InteractsWithPivotTable.php line 214
at BelongsToMany->attach(2, array(), false) in InteractsWithPivotTable.php line 160
at BelongsToMany->attachNew(array(array(), array()), array(3), false) in InteractsWithPivotTable.php line 112
at BelongsToMany->sync(array('2', '3')) in LaratrustUserTrait.php line 348
at User->syncRoles(array('2', '3')) in UsersController.php line 93
at UsersController->update(object(User), object(Request))
at call_user_func_array(array(object(UsersController), 'update'), array('user' => object(User), 'request' => object(Request))) in Controller.php line 55
at Controller->callAction('update', array('user' => object(User), 'request' => object(Request))) in ControllerDispatcher.php line 44
at ControllerDispatcher->dispatch(object(Route), object(UsersController), 'update') in Route.php line 203
at Route->runController() in Route.php line 160
at Route->run() in Router.php line 559
at Router->Illuminate\Routing\{closure}(object(Request)) in Pipeline.php line 30
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in SubstituteBindings.php line 41
at SubstituteBindings->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in Authenticate.php line 43
at Authenticate->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in VerifyCsrfToken.php line 65
at VerifyCsrfToken->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in ShareErrorsFromSession.php line 49
at ShareErrorsFromSession->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in StartSession.php line 64
at StartSession->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in AddQueuedCookiesToResponse.php line 37
at AddQueuedCookiesToResponse->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in EncryptCookies.php line 59
at EncryptCookies->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in Pipeline.php line 102
at Pipeline->then(object(Closure)) in Router.php line 561
at Router->runRouteWithinStack(object(Route), object(Request)) in Router.php line 520
at Router->dispatchToRoute(object(Request)) in Router.php line 498
at Router->dispatch(object(Request)) in Kernel.php line 174
at Kernel->Illuminate\Foundation\Http\{closure}(object(Request)) in Pipeline.php line 30
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in TransformsRequest.php line 30
at TransformsRequest->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in TransformsRequest.php line 30
at TransformsRequest->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in ValidatePostSize.php line 27
at ValidatePostSize->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in CheckForMaintenanceMode.php line 46
at CheckForMaintenanceMode->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in Pipeline.php line 102
at Pipeline->then(object(Closure)) in Kernel.php line 149
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 116
at Kernel->handle(object(Request)) in index.php line 53

and

PDOException in Connection.php line 449:
SQLSTATE[HY000]: General error: 1364 Field 'user_type' doesn't have a default value
in Connection.php line 449
at PDOStatement->execute() in Connection.php line 449
at Connection->Illuminate\Database\{closure}('insert into `role_user` (`role_id`, `user_id`) values (?, ?)', array(2, 62)) in Connection.php line 640
at Connection->runQueryCallback('insert into `role_user` (`role_id`, `user_id`) values (?, ?)', array(2, 62), object(Closure)) in Connection.php line 607
at Connection->run('insert into `role_user` (`role_id`, `user_id`) values (?, ?)', array(2, 62), object(Closure)) in Connection.php line 450
at Connection->statement('insert into `role_user` (`role_id`, `user_id`) values (?, ?)', array(2, 62)) in Connection.php line 404
at Connection->insert('insert into `role_user` (`role_id`, `user_id`) values (?, ?)', array(2, 62)) in Builder.php line 2114
at Builder->insert(array(array('role_id' => 2, 'user_id' => 62))) in InteractsWithPivotTable.php line 214
at BelongsToMany->attach(2, array(), false) in InteractsWithPivotTable.php line 160
at BelongsToMany->attachNew(array(array(), array()), array(3), false) in InteractsWithPivotTable.php line 112
at BelongsToMany->sync(array('2', '3')) in LaratrustUserTrait.php line 348
at User->syncRoles(array('2', '3')) in UsersController.php line 93
at UsersController->update(object(User), object(Request))
at call_user_func_array(array(object(UsersController), 'update'), array('user' => object(User), 'request' => object(Request))) in Controller.php line 55
at Controller->callAction('update', array('user' => object(User), 'request' => object(Request))) in ControllerDispatcher.php line 44
at ControllerDispatcher->dispatch(object(Route), object(UsersController), 'update') in Route.php line 203
at Route->runController() in Route.php line 160
at Route->run() in Router.php line 559
at Router->Illuminate\Routing\{closure}(object(Request)) in Pipeline.php line 30
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in SubstituteBindings.php line 41
at SubstituteBindings->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in Authenticate.php line 43
at Authenticate->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in VerifyCsrfToken.php line 65
at VerifyCsrfToken->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in ShareErrorsFromSession.php line 49
at ShareErrorsFromSession->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in StartSession.php line 64
at StartSession->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in AddQueuedCookiesToResponse.php line 37
at AddQueuedCookiesToResponse->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in EncryptCookies.php line 59
at EncryptCookies->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in Pipeline.php line 102
at Pipeline->then(object(Closure)) in Router.php line 561
at Router->runRouteWithinStack(object(Route), object(Request)) in Router.php line 520
at Router->dispatchToRoute(object(Request)) in Router.php line 498
at Router->dispatch(object(Request)) in Kernel.php line 174
at Kernel->Illuminate\Foundation\Http\{closure}(object(Request)) in Pipeline.php line 30
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in TransformsRequest.php line 30
at TransformsRequest->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in TransformsRequest.php line 30
at TransformsRequest->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in ValidatePostSize.php line 27
at ValidatePostSize->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in CheckForMaintenanceMode.php line 46
at CheckForMaintenanceMode->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in Pipeline.php line 102
at Pipeline->then(object(Closure)) in Kernel.php line 149
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 116
at Kernel->handle(object(Request)) in index.php line 53

@KKSzymanowski
Copy link
Collaborator

It looks like you're using Laratrust 3.1 but have database structure for 3.2. I'm not really familiar with the newest changes regarding Morph relationships. @santigarcor, can you look into it?

@too-gee
Copy link
Author

too-gee commented Apr 12, 2017

Here's some relevant output from composer.

santigarcor/laratrust                 3.2.0   This package provides a flexible way to add Role-based Permissions to Laravel
kkszymanowski/traitor                 0.2.3   Add a trait use statement to existing PHP class

@too-gee
Copy link
Author

too-gee commented Apr 12, 2017

I also downloaded the 3.2 release directly from Github and compared that to the files in my vendor directory and found them to be identical.

@KKSzymanowski
Copy link
Collaborator

It looks like the user_type attribute isn't added when the insert query is being built.
Could you run

dd(get_class(\App\User::first()->roles()));

to get the relationship type?
It should be Illuminate\Database\Eloquent\Relations\MorphToMany.
The attribute should be added here, you can put some kind of breakpoint in this method(dd('here');) to see if it's called at all.

Are your relationship definitions the defaults provided with Laratrust or did you redefine it somewhere?

@santigarcor
Copy link
Owner

santigarcor commented Apr 12, 2017

It's weird because it's calling the belongs to many relationship, but i replaced it with the morph. I'm with you @KKSzymanowski, @TeejMonster you are using the 3,1 version of laratrust because in version 3,2 that relationship is not used in the user trait for roles relationship.

Or at least you are using 3,1 user trait

@KKSzymanowski
Copy link
Collaborator

I'm not sure that's the case, the call stack looks the same in my setup. The reason is, MorphToMany extends BelongsToMany and doesn't redefine these specific methods which are called.
If you have something like this:

class Base {
    public function foo()
    {
        throw new Exception();
    }
}

class Derived extends Base {}

and call (new Derived)->foo(); you'll get A->foo() in the stack trace.

MorphToMany redefines baseAttachRecord and I think the problem lies here, it is never called.

@santigarcor
Copy link
Owner

Hmm so the only thing i can think of, is that he redefined the relationship.

@TeejMonster could you please show how does your user model looks like?

@too-gee
Copy link
Author

too-gee commented Apr 12, 2017

I added a breakpoint to vendor\laravel\framework\src\Illuminate\Database\Eloquent\Relations\MorphToMany.php on line 92 as follows:

	protected function baseAttachRecord($id, $timed)
	{
		dd('here');  // Breakpoint
		return Arr::add(
			parent::baseAttachRecord($id, $timed), $this->morphType, $this->morphClass
		);
	}

When changing user roles, this dd does not seem to be triggered and the SQL error is still thrown.

Here is app\User.php:

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Laratrust\Traits\LaratrustUserTrait;

class User extends Authenticatable
{
	use LaratrustUserTrait;
	use Notifiable;

	/**
	 * The attributes that are mass assignable.
	 *
	 * @var array
	 */
	protected $fillable = [
		'name',
		'email',
		'password',
		'note',
	];

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

	public function roles()
	{
		return $this->belongsToMany('App\Role');
	}

	public function permissions()
	{
		return $this->belongsToMany('App\Permission');
	}

	public function getRoleListAttribute()
	{
		return $this->roles->pluck('id')->toArray();
	}
}

@santigarcor
Copy link
Owner

santigarcor commented Apr 12, 2017 via email

@too-gee
Copy link
Author

too-gee commented Apr 12, 2017

Overeager coding on my part, then. I have removed the offending definitions and everything is working now.

Thank you both for your help and for the work that you put into this project.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants