2015-07-07 1 views
0

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

id  INTEGER 
user_id INTEGER 
data LONGTEXT 

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

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

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

<?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(...), но не можете узнать, как его настроить, чтобы сохранить изображение непосредственно в базе данных. Как это сделать?

ответ

0

вид

<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