Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel getting an "Array to string conversion" while storing an Array into a Json database field

I'm trying to save an array with options into a json datafield of my postgres database. I'm working with Laravel 5.5 and I'm using the extension "dimsav/laravel-translatable" for translations.

My model Question looks like this: namespace App;

use Illuminate\Database\Eloquent\Model;
use Dimsav\Translatable\Translatable;

class Question extends Model
{
    use Translatable;
    public $translatedAttributes = ['options', 'answer'];

    protected $casts = [
        'options' => 'array'
    ];
}

The model QuestionTranslation looks like this:

namespace App;

use Illuminate\Database\Eloquent\Model;

class QuestionTranslation extends Model
{

public $timestamps = false;
public $fillable = ['options', 'answer'];

}

And the store action in the QuestionsController:

 public function store(Request $request)
{
    $question = new Question();

    $options[1] = "test1";
    $options[2] = "test2";

    $question->answer = 1;
    $question->options = $options;

    $question->save();

}

When I try to store that data I get the error:

Illuminate \ Database \ QueryException
Array to string conversion (SQL: insert into "question_translations" ("locale", "answer", "options", "question_id") values (en, 1, test1, 18) returning "id")

When I use json_encode to cast $options myself, I can store it without problems.

Do you have any idea, why the laravel casting is not working? Maybe because of the translatable extension?

like image 763
JayEJay Avatar asked Dec 29 '17 20:12

JayEJay


2 Answers

May be try to use this:

protected $casts = [
    'options' => 'json',
];

I tested it on MySQL however theoretically it should works also on postgresql.

like image 155
Kamil Kiełczewski Avatar answered Nov 10 '22 20:11

Kamil Kiełczewski


I got help here:

https://laracasts.com/discuss/channels/laravel/laravel-getting-an-array-to-string-conversion-while-storing-an-array-into-a-json-database-field

Using this solution works

like image 25
JayEJay Avatar answered Nov 10 '22 20:11

JayEJay