Как сохранить двоичный файл непосредственно в поле таблицы базы данных (данные JSON) в Yii?

Я работаю над проектом Yii с базой данных, содержащей таблицу, в которой почти все его данные сохраняются в поле как JSON (это безумие, но так оно и есть):

id      INTEGER
user_id INTEGER
data    LONGTEXT

Это "поле JSON" data имеет следующую структуру и содержит, среди прочего, изображение:

{
   "id":"1",
   "foo":"bar",
   ...
   "bat":{
      "baz":"buz",
      "name":"Joe Doe",
      "my_picture":"iVBORw0KGgoAAAANSUhEUgAAAGQA...", <-- binary
      ...
    }
}

Отображать это не проблема, но теперь я хочу сделать данные редактируемыми. Моя форма выглядит так:

<?php
$form=$this->beginWidget('CActiveForm', array(
    'id' => 'insurance-form',
    'htmlOptions' => array('enctype' => 'multipart/form-data'),
    'enableAjaxValidation'=>false,
));
?>
<div class="row">
    <?php echo $form->labelEx($model, 'provider_name'); ?>
    <?php
    echo $form->textField($model, 'data[provider][name]', array(
        'size'=>60, 'maxlength'=>255, "autocomplete"=>"off"
    ));
    ?>
    <?php echo $form->error($model, 'data[provider][name]'); ?>
</div>

Оно работает.

Я знаю, что для загрузки изображений мне нужно fileField(...), но не могу узнать, как его настроить, чтобы сохранить изображение непосредственно в базе данных. Как это сделать?

1 ответ

Решение

Посмотреть

<div class="row">
    <?php echo $form->labelEx($model, 'provider_name'); ?>
    <?php
    echo $form->fileField($model, 'data[provider][name]', array());
    ?>
    <?php echo $form->error($model, 'data[provider][name]'); ?>
</div>

контроллер

public function actionUpdate($id)
{
    $model = $this->loadModel($id);

    if(isset($_POST['External'])) {
        $modelDataArray = $model->data;

        // adding the image as string to the POSted data
        if (isset($_FILES['MyModel']['name']['data']['provider']['picture'])) {
            $_POST['MyModel']['data']['provider']['picture'] = base64_encode(
                file_get_contents($_FILES['MyModel']['tmp_name']['data']['provider']['picture'])
            );
        }

        $inputFieldData = $_POST['MyModel']['data'];            
        $updatedDataArray = array_replace_recursive($modelDataArray, $inputFieldData);

        $model->attributes = $_POST['MyModel'];
        $updatedDataJson = json_encode($updatedDataArray);
        $model->setAttribute('data', $updatedDataJson);

        if($model->save()) {
            $this->redirect(array('view', 'id' => $model->id));
        }
    }

    $this->render('update', array(
        'model' => $model,
    ));
}

CActiveRecordмодель

no special changes
Другие вопросы по тегам