This error is not directly related to Laravel, and appears whenever you try to use an array as a string without explicit conversion. However, in Laravel, you can see this error in two cases: directly when using an array in a place where your application wants string and if you haven’t configured the correct type conversion for the model fields.
In this article, I will show you how to fix the array to string conversion exception in Laravel if it happens when working with Eloquent models, as well as how to save the contents of the array into a string correctly.
Table of Contents
Fixing the Error in the Model
Let’s imagine that you have a Project model, and it has a settings field that you want to write an array of settings to. For example.
app/Http/Controllers/NewProjectController.php$project = new \App\Models\Project();
$options = [
"option_1" => true,
"option_2" => false,
"option_3" => false,
];
$project->name = "Test";
$project->settings = $options;
$project->save();
If you execute the following example, you will get an error at the line where the save() method is called:
It can be difficult for beginners to find the cause of this problem because the exception indicates the save() method for the model, and it is difficult to understand where exactly the error occurred. By default, all model fields are considered to be strings. If you want to write an array to them, you can convert it to a string as described below using json_encode() or print_r().
However, this is not very convenient. Eloquent can automatically convert fields to strings when saving to the database and then restore their type when reading the model from the database using the casts mechanism. Add the $casts variable to your model, describing the conversions you need to configure this behavior. For example.
app/Models/Project.phpprotected $casts = [
'settings' => 'array'
];
You can also add a default value for this field:
app/Models/Project.phpprotected $attributes = [
'settings' => '[]'
];
Note that the default value must be a JSON-encoded string. Otherwise, you will get the same error.
At the database level, it is best to use the json or jsonb field to store arrays and other objects. But if you want, you can use varchar. After setting up $casts, you can read and write data to this field without conversion errors.
Converting an Array to a String
As mentioned above, the conversion error can be encountered if you try to use an array in the place where PHP expects a string. If this is not an accident and you really need to save the array as a string, you should convert it to a string. There are in-built functions implode() and print_r() for that purpose.
1. implode()
The implode() function expects two parameters, the first is the delimiter string that will separate array elements, and the second argument is the array itself. For example:
conversion.php<?php
$array = ["one", "two", "three"];
$str = implode(",", $array);
var_dump($str);
You will get a comma-separated string in the above example. However, this function can only work with one-dimensional arrays. If there are several other arrays in the array, it will not work. Therefore, you should check what data structure is in the array before converting it. To do this, you can use the dump() function or dd(). For example, if you pass the following array to implode(), you will also get an the same error:
conversion.php<?php
$array = [
"first" => ["one", "two", "three"],
"second" => ["four", "five", "six"]
];
$str = implode(",", $array);
In addition, the implode() function is not better solution for associative arrays. There is no universal solution for converting such an array to a string. If you need to save it just for human viewing, you can use the print_r() function.
2. print_r()
Usually, the print_r() function is used to display the value of a variable in a browser or terminal. This is most often used for debugging code. However, if you pass true to the second parameter of this function, it will return the contents of any variable as a string variable, including an array. Thus, the array shown above can be converted to a string using the following code:
conversion.php<?php
$array = [
"first" => ["one", "two", "three"],
"second" => ["four", "five", "six"]
];
$str = print_r($array, true);
var_dump($str);
3. json_encode()
If you want the converted string to be converted back to an array in the future, you need to convert it to JSON using the json_encode() function. This function serializes all objects that are in the array except for resources. For example.
conversion.php<?php
$array = [
"first" => ["one", "two", "three"],
"second" => [ "four", "five", "six"]
];
$str = json_encode($array);
var_dump($str);
Next, you can get the array of elements again using the json_decode() function. You can also use serialize() and unserialize() instead of JSON.
Wrapping Up
In this short article, I showed how to fix an array to a string conversion in Laravel-specific case, as well as how to convert an array to a string using implode() or print_r(). As you can see, it’s pretty simple.