I’m trying to update an element inside of an array on Cloud Firestore. I know that Firestore still don’t have the ability to update a single item of an element of the array. Instead, we can delete the entire element and then add the entire updated element again.
I have managed to add entire element but I don’t know how to delete the old element.
In my case, I have a list of data in a table with a button of each row. The button is to update the status in the element of the array.
Here is my function
public function store(Request $request)
{
$index = $request->index; //0, 1, 2,
$userid = $request->userid;
$ipt = $request->ipt;
$faculty = $request->faculty;
$course = $request->course;
$status = $request->status;
//remove old element by searching the index
$applyIptRef = $this->database->collection('applyIpt')->document($userid);
$applyIptRef->update([
'appliedIpt' => FieldValue::arrayRemove([$index])
]);
//add the updated element
$applyIptRef->set([
'appliedIpt' => FieldValue::arrayUnion([[
'appliedIPTName' => $ipt,
'appliedIPTFaculty' => $faculty,
'appliedIPTCourse' => $course,
'appliedIPTStatus' => $status,
]])
], ['merge' => true]);
}
Here my firestore data looks like
That is the status that I want to update. So to update we need to update the entire array right? In this case, how to delete
appliedIpt[0]
?
UPDATED status For Priyashree Bhadra’s question
I have tried sending this code
'appliedIpt' => FieldValue::arrayRemove([$index])
I got an error of
Field data must be provided as a list of arrays of form `[string|FieldPath $path, mixed $value]`
And according to the documentation for PHP, it have required parameters which are path and value. So I updated the code to this and nothing happens after executing this code.
['path' => 'appliedIpt', 'value' => FieldValue::arrayRemove([$index])]
Here is my data looks like on Laravel
I don’t know how arrayRemove works on PHP, I just want to remove this entire element?
Advertisement
Answer
I have solved my own problem. I just decoded my encoded data as element and push it to the array so that it will find the correct element in the database.
Also I found that the way I put my data into the Firestore mostly dynamic. So by using json_decode to decode the encoded json make my data as dynamic.
If there’s any possible way to do other than this solution, I welcome your suggestions.
public function store(Request $request)
{
$userid = $request->userid;
$ipt = $request->ipt;
$faculty = $request->faculty;
$course = $request->course;
$oldstatus = $request->oldstatus;
$newstatus = $request->newstatus;
$currentData = json_decode(json_encode([
'appliedIPTName' => $ipt,
'appliedIPTFaculty' => $faculty,
'appliedIPTCourse' => $course,
'appliedIPTStatus' => $oldstatus
]));
$newData = [
'appliedIPTName' => $ipt,
'appliedIPTFaculty' => $faculty,
'appliedIPTCourse' => $course,
'appliedIPTStatus' => $newstatus
];
$applyIptRef = $this->database->collection('applyIpt')->document($userid);
//remove old element
$applyIptRef->update([[
'path' => 'appliedIpt',
'value' => FieldValue::arrayRemove([$currentData])
]]);
//add the updated element
$applyIptRef->set([
'appliedIpt' => FieldValue::arrayUnion([$newData])
], ['merge' => true]);
}