diff --git a/src/VirtualColumn.php b/src/VirtualColumn.php index 1eb16b2..2e5a78e 100644 --- a/src/VirtualColumn.php +++ b/src/VirtualColumn.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Stancl\VirtualColumn; +use Illuminate\Support\Facades\Crypt; + /** * This trait lets you add a "data" column functionality to any Eloquent model. * It serializes attributes which don't exist as columns on the model's table @@ -31,6 +33,10 @@ trait VirtualColumn } foreach ($model->getAttribute(static::getDataColumn()) ?? [] as $key => $value) { + if ($model->hasCast($key, 'encrypted')) { + $value = Crypt::decryptString($value); + } + $model->setAttribute($key, $value); $model->syncOriginalAttribute($key); } diff --git a/tests/VirtualColumnTest.php b/tests/VirtualColumnTest.php index 1766f87..6349a6f 100644 --- a/tests/VirtualColumnTest.php +++ b/tests/VirtualColumnTest.php @@ -2,9 +2,10 @@ namespace Stancl\VirtualColumn\Tests; -use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Facades\DB; use Orchestra\Testbench\TestCase; +use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Crypt; +use Illuminate\Database\Eloquent\Model; use Stancl\VirtualColumn\VirtualColumn; class VirtualColumnTest extends TestCase @@ -112,7 +113,15 @@ class VirtualColumnTest extends TestCase $model = MyModel::create(['password' => $password = 'foo']); // Virtual column gets encrypted - // todo1 check what value actually got saved in $model->password (should be encrypted 'foo') + $rawEncryptedPassword = (array) DB::table('my_models') + ->select('data->password') + ->where('id', $model->id) + ->first(); + + $encryptedPassword = $rawEncryptedPassword[array_key_first((array) $rawEncryptedPassword)]; + + $this->assertNotSame($encryptedPassword, $password); + $this->assertSame(Crypt::decryptString($encryptedPassword), $password); // Virtual column gets decrypted $this->assertSame($model->password, $password); @@ -128,7 +137,7 @@ class MyModel extends Model protected $guarded = []; public $timestamps = false; public $casts = [ - 'password' + 'password' => 'encrypted' ]; public static function getCustomColumns(): array