Part 1: Main Question
On my colours_tab
table (PostgreSQL 9.6), I have a column called colours_json_col
of type JSONB.
I have the following code in my Laravel controller which creates a new record on the afore-mentioned table:
$colour_rec = new ColoursModel();
$colour_rec -> colours_json_col = ['fruits' => ['apple' => 'pink'] ];
$colour_rec -> update (['colours_json_col->fruits->apple' => 'green']);
$colour_rec -> saveOrFail();
The above code doesn't error or throw an exception, yet after executing it the new record in my database contains the following JSON data:
{"fruits": {"apple": "pink"}}
Obviously, what I want is for the apple to be green, not pink! The documentation here (https://laravel.com/docs/5.5/queries#updates) suggests that I'm doing the right thing in order set it 'green'. Can anyone see what I'm doing wrong?
Part 2: Bonus Question
In order to prevent the above code from erroring, I have had to declare the column colours_json_col
as $fillable
in the model:
protected $fillable = ['colours_json_col'];
I don't really want to set the column as $fillable
if at all possible. Therefore, is there a way to update the value without having to call the update()
function?
Answering both parts of the question in one:
$colour_rec = new ColoursModel();
$colour_rec -> colours_json_col = ['fruits' => ['apple' => 'pink'] ];
$colour_rec -> setAttribute ('colours_json_col->fruits->apple', 'green');
$colour_rec -> saveOrFail();
It seems to be an undocumented feature in Eloquent, as far as I can tell.