This is an article written to specify an error where the error itself is specified in the title of this article. The error in the context of this article is triggered in a script of a web application powered by Laravel framework. Below is the snippet code which caused the error :
$edited_role = DB::table('role')->where('id_role', '=', $id_role)->first()->toArray();
The above snippet code is actually a source code extracted from a web application powered by Laravel framework. The source code itself is specifically extracted from a Laravel Controller file named RoleController.php. There is a method in the controller which is defined for editing a ‘Role’ where the ‘Role’ in the context of this application is the additional role of user in that application have.
Aside from the concept of the ‘Role’ itself, regarding the error triggered, the snippet code above is written to get a single record from a table named ‘role’. It is obvious since the execution of the snippet code above is trying to get a record with the unique id of ‘id_role’ where it is the primary key of the table named ‘role’.
The error itself can be viewed in the following image :
Another clue which is indicating the process of only extracting one record from the database named ‘role’ is the syntax pattern of ‘->first()’ which is added in the query generated using the query builder class DB. As we already knew, the DB class is a facade which is providing a specific feature where one of the feature is the ability to connect to a database and and performing various operations on it using the query generated from the DB class itself.
As stated in the Laravel documentation page, Facades provide a “static” interface to classes that are available in the application’s service container. And back to the method ‘->first()’ called from the DB class where the function itself is becoming the key to solve the error.
The method ‘->first()’ is called for ‘Retrieving a Single Row from a Table’ which is stated in the Laravel Documentation page in this link. Since it is a single row extracted, it is obvious that there will no array can be produced using only a single row. So, just remove the ‘->toArray()’ syntax pattern in the end of the snippet code. The snippet code can be translated as getting or converting an single object called ‘stdClass’ representing the single record found in the table named ‘role’ is forced to be an array.
toArray is changing the collection of objects into an array of objects, like it should. If you want the objects inside the collection to also be arrays, you need to first convert each object:
$users = DB::table(‘users’)->where([…])->take(1)->get();
$array = $users->map(function($obj){
return (array) $obj;
})->toArray();