Помилка Array to String Conversion в Laravel

Ця помилка не має безпосереднього відношення до Laravel, та зявляється завжди, коли ви намагаєтесь використати масив в якості стрічки без явної конвертації. Але в Laravel в можете побачити цю помилку у двох випадках: безпосередньо при використанні масива в там де треба стрічка, а також якщо ви не налаштували правлиьне перетворення типів для полей моделі.

В цій статті я покажу як виправити помилку array to string conversion exception в Laravel якщо це сталось при роботі з моделю, а також як правильно зберегти вміст масиву в стрічку.

Виправлення помилки в моделі

Давайте уявимо, що у вас є модель Project, а у неї є поле settings, в яке ви хочете записати массив налаштувань. Наприклад:

app/Http/Controllers/NewProjectController.php$project = new \App\Models\Project(); $options = [ "option_1" => true, "option_2" => false, "option_3" => false, ]; $project->name = "Test"; $project->settings = $options; $project->save();

Якщо ви виконаєте такий код то отримаєте помилку на виклику методу save():

Початківцям може бути важко знайти причину цієї проблеми, тому що виключення вказує на виклик методу save() для моделі і важко зрозуміти де саме сталась помилка. За замовучуванням всі поля моделі вважаються стрічками. Якщо ви хочете записати в них масив, то ви можете сконвертувати його в стрічку як описано нижче за допомогою json_encode() або print_r(). Але це не дуже зручно. Eloquent може автоматично конвертувати поля в стрічку при збереженні в базу данних, а потім відновлювати їх тип при читанні моделі з бази данних за допомогою механізму casts. Для цього додайте змінну $casts для вашої моделі з описом перетворень. Наприклад:

app/Models/Project.phpprotected $casts = [ 'settings' => 'array' ];

Також ви можете додати значення за замовчуванням для цього поля:

app/Models/Project.phpprotected $attributes = [ 'settings' => '[]' ];

Зверніть увагу, що значення за замовчуванням має бути стічкою в форматі JSON, інакше ви отримаєте таку ж саму помилку.

На рівні бази данних для збереження масивів і інших обєктів краще за все використовувати поле json або jsonb. Але якщо хочете, ви можете використовувати varchar. У будь-якому випадку після налаштування casts ви зможете читати і записувати данні в це поле без помилок.

Конвертація масиву в стрічку

Як сказано вище, таку помилку можна отримати, якщо ви намагаєтесь використати масив, там де PHP очікує отримати стрічку. Якщо таке трапилось не випадково і вам дійсно треба зберегти масив як стрічку, то його варто конвертувати у стрічку. Для цього існують функціі implode() та print_r().

1. implode

Функція implode() приймає два параметри, перший це символ або стрічка, якою буду розділені елементи масиву, а другий сам масив. Наприклад:

conversion.php<?php $array = ["one", "two", "three"]; $str = implode(",", $array); var_dump($str);

Але ця функція може працювали лише з одновимірними масивами. Якщо в масиві знаходиться ще декілька масивів, то нічого не вийде. Тому варто зразу подивитись що знаходиться в масиві, який ви збираєтесь конвертувати. Для цього можна скористатись функцією dump() ибо dd(). Наприклад, якщо ви передасте в implode() наступний масив, то теж отримаєте помилку array to string conversion:

conversion.php<?php $array = [ "first" => ["one", "two", "three"], "second" => ["four", "five", "six"], ]; $str = implode(",", $array);

Універсального рішення, як сконвертувати такий масив в стрічку немає. Якщо його потрібно зберегти просто для перегляду людиною, то можна скористатись функцією print_r().

2. print_r

Зазвичай функція print_r() застосовується для виводу значення змінної в браузер або консоль. Найчастіше це використовується для відладки коду. Але якщо в другий параметр цієї функції передати true, то вона виведе вміст будь-якої змінної, в тому числі масиву в стрічку. Таким чином масив показаний вище може бути перетворений в стрічку за допомогою такого коду:

conversion.php<?php $array = [ "first" => ["one", "two", "three"], "second" => ["four", "five", "six"], ]; $str = print_r($array, true); var_dump($str);

3. json_encode

Якщо ж ви хочете щоб стрічку з масивом у майбутньому можна було конвертувати назад в масив, то потрібно перетворити його в JSON за допомогою функції json_encode(). Ця функція серіалізує всі обєкти які знаходяться в масиві окрім ресурсів. Наприклад:

conversion.php<?php $array = [ "first" => ["one", "two", "three"], "second" => ["four", "five", "six"], ]; $str = json_encode($array); var_dump($str);

Далі ви можете знову отримати масив за допомогою функції json_decode(). Також замість json можна використовувати serialize() та unserialize().

Висновки

В цій короткій статті я показав як виправити array to a string conversion в Laravel при роботі з моделями, а також як конвертувати масив в стрічку за допомогою implode() або print_r(). Як бачите, це доволі просто.

Залишити коментар