Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

Kris01's avatar

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
0 likes
24 replies
PovilasKorop's avatar

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.

1 like
Yorki's avatar

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?

1 like
Kris01's avatar

@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',
    ];
Yorki's avatar

@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);
1 like
Kris01's avatar

@Yorki stil same error, could it somehow be that append I mentioned?

Yorki's avatar

@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
1 like
Kris01's avatar

@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),
            ],
        ];
    }
Yorki's avatar

@Kris01 and if you remove $this from argument list?

public function getCanAttribute() : array
{
  return [
    'manage' => [
      'permissions' => $this->can(UserPolicy::MANAGE),
    ],
  ];
}    	
1 like
Kris01's avatar

@Yorki nope.

the error occurs when doing

$user->save()

in the controller

so something with that must be a problem

Kris01's avatar

@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 ?

Kris01's avatar

@Yorki

[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

Yorki's avatar

@Kris01 and you if you return bool?

public function getCanAttribute(): bool
{
  return $this->can(UserPolicy::MANAGE);
}    	
1 like
Yorki's avatar

@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);
1 like
Kris01's avatar

@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}  
Kris01's avatar

@Yorki still same error, because it goes down on this line

$user->save()
Yorki's avatar

@Kris01 and if you do dd($user) or dd($user->toArray()) before $user->save() what does it output?

1 like
Kris01's avatar

@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's avatar

@Yorki i really don't know what to do. Thanks for the help btw

Yorki's avatar

@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.