Alexander Nikolov
Alexander Nikolov

Reputation: 1979

Object of class stdClass could not be converted to string - laravel

I am following this documentation

to implement export to Excel in my laravel 4 project.

So am trying to generate excel file from array like this:

//$results is taken with db query

$data = array();
foreach ($results as $result) {
   $result->filed1 = 'some modification';
   $result->filed2 = 'some modification2';
   $data[] = $result;
}
Excel::create('Filename', function($excel) use($data) {

$excel->sheet('Sheetname', function($sheet) use($data) {

    $sheet->fromArray($data);

      });

})->export('xls');

But this raises exception:

  Object of class stdClass could not be converted to string

What am I doing wrong ?

UPDATE:

Tried this:

$data = get_object_vars($data);

which results in:

get_object_vars() expects parameter 1 to be object, array given

This:

$data = (array)$data;

Results in the initial error.

Upvotes: 28

Views: 174008

Answers (7)

Loc Nguyen
Loc Nguyen

Reputation: 1

toArrayDeep worked for me

$data = $query->get()->toArrayDeep();

Upvotes: 0

Güney Saramalı
Güney Saramalı

Reputation: 799

I was recieving the same error when I was tring to call an object element by using another objects return value like;

$this->array1 = a json table which returns country codes of the ip
$this->array2 = a json table which returns languages of the country codes

$this->array2->$this->array1->country;// Error line

The above code was throwing the error and I tried many ways to fix it like; calling this part $this->array1->country in another function as return value, (string), taking it into quotations etc. I couldn't even find the solution on the web then i realised that the solution was very simple. All you have to do it wrap it with curly brackets and that allows you to target an object with another object's element value. like;

$this->array1 = a json table which returns country codes of the ip
$this->array2 = a json table which returns languages of the country codes

$this->array2->{$this->array1->country};

If anyone facing the same and couldn't find the answer, I hope this can help because i spend a night for this simple solution =)

Upvotes: 1

Japhet Johnson
Japhet Johnson

Reputation: 11

This is easy all you need to do is something like this Grab your contents like this

  $result->get(filed1) = 'some modification';
  $result->get(filed2) = 'some modification2';

Upvotes: 0

kunal
kunal

Reputation: 4248

Try this simple in one line of code:-

$data= json_decode( json_encode($data), true);

Hope it helps :)

Upvotes: 63

Edujugon
Edujugon

Reputation: 91

If you have a Collection of stdClass objects, you could try with this:

$data = $data->map(function ($item){
            return get_object_vars($item);
        });

Upvotes: 2

Kishor Kurian
Kishor Kurian

Reputation: 185

You might need to change your object to an array first. I dont know what export does, but I assume its expecting an array.

You can either use

get_object_vars()

Or if its a simple object, you can just typecast it.

$arr = (array) $Object;

Upvotes: 10

Damien Pirsy
Damien Pirsy

Reputation: 25435

$data is indeed an array, but it's made up of objects.

Convert its content to array before creating it:

$data = array();
foreach ($results as $result) {
   $result->filed1 = 'some modification';
   $result->filed2 = 'some modification2';
   $data[] = (array)$result;  
   #or first convert it and then change its properties using 
   #an array syntax, it's up to you
}
Excel::create(....

Upvotes: 31

Related Questions