Похоже, что здесь происходит несколько проблем.
Во-первых, PHP использует массивы как для карт, так и для "обычных" массивов. В PHP нет объектного литерала ({}
). Значения массива задаются с помощью оператора =>
, а не :
.
Во-вторых, DocumentReference::update()
принимает список значений, которые вы хотите изменить, с путем и значением. Поэтому вызов обновления будет выглядеть так:
$docRef->update([
['path' => 'foo', 'value' => 'bar'
]);
Вы можете использовать DocumentReference::set()
для желаемого поведения. set()
создаст документ, если он не существует, где update()
выдаст ошибку, если документ не существует. set()
также заменит все существующие поля в документе, если вы не укажете поведение слияния:
$docRef->set([
'foo' => 'bar'
], ['merge' => true]);
Следовательно, ваш код можно переписать следующим образом:
$jobId = "XXXX";
$docRef = $firestore->collection('jobs')->document($jobId);
$docRef->set([
'messages' => FieldValue::arrayUnion([[
'category' => '0',
'message' => 'TEST',
'sender' => 'TEAM',
]])
], ['merge' => true]);
$jobId = "XXXX";
$docRef = $firestore->collection('jobs')->document($jobId);
$docRef->update([
[
'path' => 'messages', 'value' => FieldValue::arrayUnion([[
'category' => '0',
'message' => 'TEST',
'sender' => 'TEAM',
]])
]
]);
И еще одна заключительная вещь: arrayUnion
не будет добавлять повторяющиеся значения. Таким образом, если указанное вами значение (включая все ключи и значения во вложенной карте) уже существует, оно не будет добавлено к документу.
Если вы еще этого не сделали, включите отчеты об ошибках в своей среде разработкиполучить информацию о том, почему ваш код не работает. PHP сообщит вам об ошибках анализа, включенных в ваш фрагмент, а клиент Firestore сообщит вам об ошибках, которые часто могут быть весьма полезны.