What is the value of $request->validated()?
ErrorException: Array to string conversion when using save()
Hello, this is what I am doing
\DB::beginTransaction();
$user = new User($request->validated());
$user->is_active = $request->input('is_active');
$user->save();
$user->permissions()->attach($request->permissions);
\DB::commit();
this is the error i am getting
[2023-01-20 00:02:30] local.ERROR: ErrorException: Array to string conversion in /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Support/Str.php:609
As @mohamedtammam pointed out, there is likely some value in the request, while creating the user, that causes this internal error while converting some value to the string.
So you should debug what's inside that $request->validated(), like do dd($request->validated()); as the first line in that method and see the values.
dd($request->validated());
gives as response the following , which seems fine
array:3 [▼
"name" => "lalalala"
"email" => "[email protected]"
"is_active" => 0
]
I would investigate this line:
$user->permissions()->attach($request->permissions);
Are you using ready library for permissions? If so which one? What is the output of $request->permissions?
@Yorki the output of $request->permissions is the following
array:2 [▼
0 => 1
1 => 2
]
Another thing i noticed, is that I think that it stopped working after I added this in the User model. COuld this have anything to do?
protected $appends = [
'can',
];
@Kris01 You either use:
// this is syncing permission which means it (detaching) override old ones
$user->permissions()->sync($request->permissions);
or
foreach ($request->permissions as $permissionId) {
$user->permissions()->attach($permissionId);
}
or simply:
// this is syncing permission without detaching old ones
$user->permissions()->sync($request->permissions, false);
@Yorki stil same error, could it somehow be that append I mentioned?
@Kris01 what exactly you added can for? You have two methods to check if user can do something:
$user->can('something');
or in blade:
@can('something')
<p>I can do that</p>
@endcan
@Yorki I am working with inertia so I used 'can' to be able to see on the front-end if I want to show or not specific fields when creating the user.
this is my store controller
try {
\DB::beginTransaction();
$user = new User($request->validated());
$user->is_active = $request->input('is_active');
$user->save();
$user->permissions()->attach($request->permissions);
\DB::commit();
} catch(\Exception $ex) {
\DB::rollBack();
log_exception($ex);
return redirect()->back()->withErrors(['message' => "An error has occured while trying to create user. Please try again." , "status" => 500]);
}
session()->flash('success', ['message' => "User was successfully created. An e-mail has been sent to the user. The user needs to activate the account by clicking on the e-mail's activation link.",'status' => 200]);
return redirect()->route('admin.user.index');
this is my user model (the main thigs)
protected $fillable = [
'name', 'email', 'password',
];
protected $attributes = [
'is_active' => 1,
'can_login' => 1,
];
protected $appends = [
'can',
];
public static $withoutAppends = false;
protected $hidden = [
'password', 'remember_token',
];
protected $casts = [
'email_verified_at' => 'datetime',
];
protected $dates = ['created_at'];
protected $table = 'users';
public function getCanAttribute() : array
{
return [
'manage' => [
'permissions' => $this->can(UserPolicy::MANAGE, $this),
],
];
}
@Kris01 and if you remove $this from argument list?
public function getCanAttribute() : array
{
return [
'manage' => [
'permissions' => $this->can(UserPolicy::MANAGE),
],
];
}
@Yorki nope.
the error occurs when doing
$user->save()
in the controller
so something with that must be a problem
@Kris01 could paste the full stack trace?
@Yorki I can confirm that the problem is the append in the model, when I comment it, it works.
But how can i solve it ?
[2023-01-24 00:38:53] local.ERROR: ErrorException: Array to string conversion in /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Support/Str.php:609
@Kris01 and you if you return bool?
public function getCanAttribute(): bool
{
return $this->can(UserPolicy::MANAGE);
}
@Yorki that is not the solution unfortunately!
@Kris01 at this point I cannot help you without full stack trace, you only did paste the last call from stack trace, not the actual chain of methods calls which should be like 30+ lines.
But what happens if you comment out this line?:
// $user->permissions()->attach($request->permissions);
@Yorki this is it, but I am sure it has something to do with the append in the model, because when I delete it, it works
[2023-01-24 01:40:12] local.ERROR: ErrorException: Array to string conversion in /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Support/Str.php:609
Stack trace:
#0 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Support/Str.php(609): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError()
#1 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Database/QueryException.php(57): Illuminate\Support\Str::replaceArray()
#2 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Database/QueryException.php(40): Illuminate\Database\QueryException->formatMessage()
#3 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Database/Connection.php(713): Illuminate\Database\QueryException->__construct()
#4 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Database/Connection.php(672): Illuminate\Database\Connection->runQueryCallback()
#5 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Database/Connection.php(502): Illuminate\Database\Connection->run()
#6 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Database/Connection.php(454): Illuminate\Database\Connection->statement()
#7 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Database/Query/Processors/Processor.php(32): Illuminate\Database\Connection->insert()
#8 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3028): Illuminate\Database\Query\Processors\Processor->processInsertGetId()
#9 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(1657): Illuminate\Database\Query\Builder->insertGetId()
#10 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(1188): Illuminate\Database\Eloquent\Builder->__call()
#11 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(1153): Illuminate\Database\Eloquent\Model->insertAndSetId()
#12 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(994): Illuminate\Database\Eloquent\Model->performInsert()
#13 /var/www/html/panel/app/Providers/ObserverServiceProvider.php(101): Illuminate\Database\Eloquent\Model->save()
#14 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php(401): App\Providers\ObserverServiceProvider->App\Providers\{closure}()
#15 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php(249): Illuminate\Events\Dispatcher->Illuminate\Events\{closure}()
#16 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasEvents.php(189): Illuminate\Events\Dispatcher->dispatch()
#17 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(1174): Illuminate\Database\Eloquent\Model->fireModelEvent()
#18 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(994): Illuminate\Database\Eloquent\Model->performInsert()
#19 /var/www/html/panel/app/Http/Controllers/Admin/UserController.php(78): Illuminate\Database\Eloquent\Model->save()
#20 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\Http\Controllers\Admin\UserController->store()
#21 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\Routing\Controller->callAction()
#22 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Routing/Route.php(262): Illuminate\Routing\ControllerDispatcher->dispatch()
#23 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\Routing\Route->runController()
#24 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Routing/Router.php(721): Illuminate\Routing\Route->run()
#25 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\Routing\Router->Illuminate\Routing\{closure}()
#26 /var/www/html/panel/app/Http/Middleware/AdminRoute.php(38): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#27 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\Http\Middleware\AdminRoute->handle()
#28 /var/www/html/panel/app/Http/Middleware/AdminCheck.php(20): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#29 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\Http\Middleware\AdminCheck->handle()
#30 /var/www/html/panel/vendor/inertiajs/inertia-laravel/src/Middleware.php(82): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#31 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Inertia\Middleware->handle()
#32 /var/www/html/panel/app/Http/Middleware/AdminPort.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#33 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\Http\Middleware\AdminPort->handle()
#34 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#35 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Routing\Middleware\SubstituteBindings->handle()
#36 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(78): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#37 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle()
#38 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Session/Middleware/AuthenticateSession.php(39): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#39 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Session\Middleware\AuthenticateSession->handle()
#40 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#41 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\View\Middleware\ShareErrorsFromSession->handle()
#42 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(121): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#43 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(64): Illuminate\Session\Middleware\StartSession->handleStatefulRequest()
#44 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Session\Middleware\StartSession->handle()
#45 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#46 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle()
#47 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(67): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#48 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Cookie\Middleware\EncryptCookies->handle()
#49 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#50 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Routing/Router.php(723): Illuminate\Pipeline\Pipeline->then()
#51 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Routing/Router.php(698): Illuminate\Routing\Router->runRouteWithinStack()
#52 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Routing/Router.php(662): Illuminate\Routing\Router->runRoute()
#53 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Routing/Router.php(651): Illuminate\Routing\Router->dispatchToRoute()
#54 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(167): Illuminate\Routing\Router->dispatch()
#55 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}()
#56 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#57 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#58 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle()
#59 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#60 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#61 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Foundation\Http\Middleware\TrimStrings->handle()
#62 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#63 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle()
#64 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(86): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#65 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle()
#66 /var/www/html/panel/vendor/fruitcake/laravel-cors/src/HandleCors.php(37): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#67 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fruitcake\Cors\HandleCors->handle()
#68 /var/www/html/panel/vendor/fideloper/proxy/src/TrustProxies.php(57): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#69 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fideloper\Proxy\TrustProxies->handle()
#70 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#71 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(142): Illuminate\Pipeline\Pipeline->then()
#72 /var/www/html/panel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(111): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter()
#73 /var/www/html/panel/public/index.php(59): Illuminate\Foundation\Http\Kernel->handle()
#74 {main}
@Yorki still same error, because it goes down on this line
$user->save()
@Kris01 and if you do dd($user) or dd($user->toArray()) before $user->save() what does it output?
@Yorki here it is, I am sure the problem is the 'append', I should be able to hide it somehow
App\Models\Admin\User {#605 ▼
#fillable: array:3 [▶]
#attributes: array:4 [▼
"is_active" => 1
"can_login" => 1
"name" => "testuser"
"email" => "[email protected]"
]
#hidden: array:2 [▶]
#casts: array:1 [▶]
#dates: array:1 [▶]
+timestamps: true
#connection: "mysql"
#table: "users"
#guard: "admin"
#dispatchesEvents: array:1 [▶]
#appends: array:1 [▼
0 => "can"
]
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
+preventsLazyLoading: false
#perPage: 15
+exists: false
+wasRecentlyCreated: false
#escapeWhenCastingToString: false
#original: array:2 [▶]
#changes: []
#classCastCache: []
#attributeCastCache: []
#dateFormat: null
#observables: []
#relations: []
#touches: []
#visible: []
#guarded: array:1 [▶]
#rememberTokenName: "remember_token"
-lastLog: null
+custom_is_observable: true
#custom_observable_appends: []
#can_be_touched: false
#should_mark_first_records: false
}
@Kris01 thats weird because $appends shouldn't affect saving https://laravel.com/docs/9.x/eloquent-serialization#appending-values-to-json
@Yorki i really don't know what to do. Thanks for the help btw
@Kris01 my last thought is that you change your attribute to different name since can is existing method from permission system, something like:
protected $appends = [
'can_do',
];
...
public function getCanDoAttribute() : array
{
return [
'manage' => [
'permissions' => $this->can(UserPolicy::MANAGE),
],
];
}
Please or to participate in this conversation.