<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
solution-forest / laravel-dynamic-properties example snippets
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use SolutionForest\LaravelDynamicProperties\Traits\HasProperties;
class User extends Model
{
use HasProperties;
// Your existing model code...
}
// In a migration
Schema::table('users', function (Blueprint $table) {
$table->json('dynamic_properties')->nullable();
});
Schema::table('companies', function (Blueprint $table) {
$table->json('dynamic_properties')->nullable();
});
// Full-text search on text properties
$users = User::whereRaw(
"EXISTS (SELECT 1 FROM entity_properties ep WHERE ep.entity_id = users.id
AND ep.entity_type = ? AND MATCH(ep.string_value) AGAINST(? IN BOOLEAN MODE))",
['App\\Models\\User', '+marketing +manager']
)->get();
use YourVendor\DynamicProperties\Exceptions\PropertyNotFoundException;
use YourVendor\DynamicProperties\Exceptions\PropertyValidationException;
try {
$user->setDynamicProperty('nonexistent_property', 'value');
} catch (PropertyNotFoundException $e) {
// Handle property not found
echo "Property not found: " . $e->getMessage();
}
try {
$user->setDynamicProperty('age', 'invalid_number');
} catch (PropertyValidationException $e) {
// Handle validation error
echo "Validation failed: " . $e->getMessage();
}
// Error: "Property 'phone' not found"
$user->setDynamicProperty('phone', '+1234567890');
Property::create(['name' => 'phone', 'type' => 'text']);
$user->setDynamicProperty('phone', '+1234567890'); // Now works
// Error: "Validation failed for property 'age'"
$user->setDynamicProperty('age', -5);
$property = Property::where('name', 'age')->first();
var_dump($property->validation); // See what rules are defined
$user->setDynamicProperty('age', 25); // Use valid value
// Getting different results for the same logical query
$users1 = User::whereProperty('level', '>', 5)->get(); // 10 results
$users2 = User::whereProperty('level', '>', '5')->get(); // 3 results
Property::create(['name' => 'level', 'type' => 'number']);
// Now both queries will return the same results