Этот дамп dd($post['comments']);
показывает содержимое ниже:
^ "[{"key": "o0Gdz1EsxOpOLN", "layout": "comment", "attributes": {"title": "a", "comment": "b"}}]"
Затем эти данные преобразуются следующим образом:
[
'name' => "comments",
'data' => [
'comments' =>
collect($post['comments'])->map(function ($comment) {
return [
'title' => $comment['attributes']['title'],
'message' => $comment['attributes']['message'],
];
}),
]
],
Но показывает ошибку:
Cannot access offset of type string on string
Ошибка кажется здесь:
'title' => $comment['attributes']['title'],
Вы знаете, в чем может быть дело?
Или, если comments
является столбцом базы данных в таблице posts
, вы можете включить comments
в массив protected $casts
. ссылка
Используйте json_decode()
для доступа к данным.
[
'name' => "comments",
'data' => [
'comments' =>
collect(json_decode($post['comments'], true))->map(function ($comment) {
return [
'title' => $comment['attributes']['title'],
'message' => $comment['attributes']['message'],
];
}),
]
],
Но вы должны заранее проверить, что содержимое $post['comments']
содержит нужную вам структуру данных json.
Спасибо! Что вы имеете в виду под тестом?
@Bernard, если данные поступают из запроса: либо вы отправляете свои данные с неправильным заголовком (должен быть json-applicatoin), либо вы слепо верите, что с форматом никогда не будет проблем. Вы должны установить некоторые правила проверки в любом случае, чтобы не вызывать ошибок при выполнении.
@Bernard, если ваши данные из базы данных, вы можете настроить автоматическое приведение к полю «комментарий» laravel.com/docs/9.x/eloquent-mutators#array-and-json-casting
Похоже, ваши
comments
в формате json. Возможно, вам придется добавить к немуjson_decode
, прежде чем пытаться получить к нему доступ как к массиву.