diff --git a/src/VirtualColumn.php b/src/VirtualColumn.php index f7a6e3c..82de5aa 100644 --- a/src/VirtualColumn.php +++ b/src/VirtualColumn.php @@ -139,4 +139,18 @@ public static function getCustomColumns(): array 'id', ]; } + + /** + * Get a column name for an attribute that can be used in SQL queries. + * + * (`foo` or `data->foo` depending on whether `foo` is in custom columns) + */ + public function getColumnForQuery(string $column): string + { + if (in_array($column, static::getCustomColumns(), true)) { + return $column; + } + + return static::getDataColumn() . '->' . $column; + } } diff --git a/tests/VirtualColumnTest.php b/tests/VirtualColumnTest.php index 812b599..247b189 100644 --- a/tests/VirtualColumnTest.php +++ b/tests/VirtualColumnTest.php @@ -88,6 +88,23 @@ public function model_is_always_decoded_when_accessed_by_user_event() MyModel::first(); } + /** @test */ + public function column_names_are_generated_correctly() + { + // FooModel's virtual data column name is 'virtual' + $virtualColumnName = 'virtual->foo'; + $customColumnName = 'custom1'; + + /** @var FooModel $model */ + $model = FooModel::create([ + 'custom1' => $customColumnName, + 'foo' => $virtualColumnName + ]); + + $this->assertSame($customColumnName, $model->getColumnForQuery('custom1')); + $this->assertSame($virtualColumnName, $model->getColumnForQuery('foo')); + } + // maybe add an explicit test that the saving() and updating() listeners don't run twice? } @@ -107,3 +124,25 @@ public static function getCustomColumns(): array ]; } } + +class FooModel extends Model +{ + use VirtualColumn; + + protected $guarded = []; + public $timestamps = false; + + public static function getCustomColumns(): array + { + return [ + 'id', + 'custom1', + 'custom2', + ]; + } + + public static function getDataColumn(): string + { + return 'virtual'; + } +} diff --git a/tests/etc/migrations/2022_10_21_000001_create_foo_models_table.php b/tests/etc/migrations/2022_10_21_000001_create_foo_models_table.php new file mode 100644 index 0000000..98aa537 --- /dev/null +++ b/tests/etc/migrations/2022_10_21_000001_create_foo_models_table.php @@ -0,0 +1,32 @@ +increments('id'); + + $table->string('custom1')->nullable(); + $table->string('custom2')->nullable(); + + $table->json('virtual'); + }); + } + + public function down() + { + Schema::dropIfExists('foo_models'); + } +}