@11dante

Как преобразовать массив в строку?

В своем плагине для поста добавил поле Checkbox list с вариантами выбора, добавил для него в таблице mysql поле paid_free с типом string , при выборе одного или нескольких вариантов выдает ошибку ("Unexpected type of array when attempting to save attribute "paid_free", try adding it to the $jsonable property.")
В модели поста я добавил protected $jsonable = ['paid_free']; после чего варианты options стали улетать в базу с видом ["ОМС","ДМС"].
На сайте в посте стало выдавать ошибку An exception has been thrown during the rendering of a template ("Array to string conversion").
И далее у меня проблема в том как вернуть в обратный вид, чтобы вывод на сайте работал.
Я пробовал добавить
protected $casts = [
        'paid_free' => 'array',
];

но выдает другую ошибку json_decode(): Argument #1 ($json) must be of type string, array given
Я начинаю только в разработке и возможно что-то где то глупо, что-то не понимаю
общий вид модели
<?php namespace project\Service\Models;

use Model;

/**
 * Item Model
 *
 * @link https://docs.octobercms.com/3.x/extend/system/models.html
 */
class Item extends Model
{

    protected $jsonable = ['paid_free'];

    /**
     * @var string table name
     */
    public $table = 'project_service_items';

    /**
     * @var array relation
     */
    public $belongsTo = [
        'category' => ['project\service\models\Category']
    ];

    protected $casts = [
        'paid_free' => 'array',
    ];
}


Компонент поста
<?php namespace project\Service\Components;

use Cms\Classes\ComponentBase;

/**
 * Item Component
 *
 * @link https://docs.octobercms.com/3.x/extend/cms-components.html
 */
class Item extends ComponentBase
{
    public function componentDetails()
    {
        return [
            'name' => 'Item Component',
            'description' => 'No description provided yet...'
        ];
    }

    /**
     * @link https://docs.octobercms.com/3.x/element/inspector-types.html
     */
    public function defineProperties()
    {
        return [
            'slugCategory' => [
                'title' => 'Ссылка на категории',
                'default' => '{{ :category }}',
            ],
            'slugItem' => [
                'title' => 'Ссылка услуги',
                'default' => '{{ :item }}',
            ],
        ];
    }

    public function onRun()
    {
        $category = \project\service\models\category::where('slug', $this->property('slugCategory'))->first();

        if (empty($category)){
            return $this->controller->run('404');
        }

        $item = \project\service\models\item::where('category_id', $category->id)->where('slug', $this->property('slugItem'))->first();

        if (empty($item)){
            return $this->controller->run('404');
        }

        $this->page['item'] = $item;
    }
}


в фронте вывожу {{ item.paid_free }}

Возможно название указал некорректно
  • Вопрос задан
  • 172 просмотра
Пригласить эксперта
Ответы на вопрос 2
@burtellbee
Функция implode() преобразует массив в строку.
$array = ['имя', 'почта', 'телефон'];
var_dump(implode(",", $array)); // string(32) "имя,почта,телефон"

Но мне кажется тебе надо подумать с сохранением переменной в БД, сейчас ты ее хранишь как массив. А потом пытаешься использовать как строку. Может проще тогда хранить строкой, например в json и дальше работать с ней как тебе необходимо преобразую в массив или наоборот. json_encode(), json_decode
Ответ написан
Комментировать
@aleksejjjjj
// protected $jsonable = ['paid_free']; - выкидываем

// оставляем
protected $casts = [
    'paid_free' => 'array',
];

// Сохранение - тут произвольный массив
$item->paid_free = ['one', 'two', 'three'];

// Вывод в шаблоне - {{  }} ожидает строку а вы массив суёте
{{ implode(', ', $item->paid_free) }}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы