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

14,471

Solution 1

May be try to use this:

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

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

Solution 2

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

Share:
14,471

Related videos on Youtube

JayEJay
Author by

JayEJay

Updated on September 16, 2022

Comments

  • JayEJay
    JayEJay over 1 year

    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?