2016-12-10 2 views
2

My-Modell wie folgt definiert ist:Kuchen 3: Spalte des Typs JSON speichert eine NULL als String „null“

<?php 
namespace App\Model\Table; 

use Cake\ORM\Table; 
use Cake\Database\Schema\Table as Schema; 

class AppLogsTable extends Table 
{  
    protected function _initializeSchema(Schema $schema) { 
     $schema->columnType('data', 'json'); 
     return $schema; 
    }  
} 

JSON-Format korrekt angewendet wird, wenn sie in Datenbank speichern und beim Abrufen von Daten. Wenn ich jedoch $appLog->data = null einstelle und es durch $this->appLogs->save($appLog) speichere, würde eine Zeichenkette null in der Datenbank gespeichert werden, anstatt ein echter NULL Wert. Die Spalte data in der Tabelle app_logs ist so eingestellt, dass Nullen akzeptiert werden.

Wenn ich die Spaltentypdefinition auskommentiere, werden Nullen korrekt gespeichert.

Wie den automatischen JSON-Datentyp beibehalten und NULL korrekt aus dem Modell speichern?

Antwort

2

Sie erhalten eine benutzerdefinierte/erweiterte Datenbanktyp-Klasse verwenden müssen, die null Werte entsprechend behandelt, wird die eingebaute in einem alles durch json_encode() egal was passieren.

Etwas nach dem Vorbild dieses:

// src/Database/Type/NullAwareJsonType.php 

namespace App\Database\Type; 

use Cake\Database\Driver; 
use Cake\Database\Type\JsonType; 

class NullAwareJsonType extends JsonType 
{ 
    public function toDatabase($value, Driver $driver) 
    { 
     if ($value === null) { 
      return null; 
     } 

     return parent::toDatabase($value, $driver); 
    } 
} 

Sie können dann entweder die in json Typ gebaut außer Kraft setzen:

// config/bootstrap.php 

\Cake\Database\Type::map('json', \App\Database\Type\NullAwareJsonType::class); 

oder es als eine neue Art Karte und den Spaltentyp eingestellt entsprechend:

\Cake\Database\Type::map('nullAwareJson', \App\Database\Type\NullAwareJsonType::class); 
$schema->columnType('data', 'nullAwareJson'); 

Siehe auch

+0

dies Nachdem ich (und ich selbst dies ein paar Mal erlebt) Ich denke, es ist Zeit sein könnte, diese pluginize: Siehe [Shim Plugin PR] (https://github.com/dereuromark/cakephp-shim/pull/10). – mark