DataObjectSchema
class DataObjectSchema (View source)
Provides dataobject and database schema mapping functionality
Traits
A class that can be instantiated or replaced via DI
Provides extensions to this object to integrate it with standard config API methods.
Constants
HAS_ONE_MULTI_RELATIONAL |
Configuration key for has_one relations that can support multiple reciprocal has_many relations. |
DB_ONLY |
fieldSpec should exclude virtual fields (such as composite fields), and only include fields with a db column. |
UNINHERITED |
fieldSpec should only return fields that belong to this table, and not any ancestors |
INCLUDE_CLASS |
fieldSpec should prefix all field specifications with the class name in RecordClass.Column(spec) format. |
Config options
table_namespace_separator | string | Default separate for table namespaces. Can be set to any string for databases that do not support some characters. |
Properties
protected | array | $databaseFields | Cache of database fields |
|
protected | array | $databaseIndexes | Cache of database indexes |
|
protected | array | $defaultDatabaseIndexes | Fields that should be indexed, by class name |
|
protected | array | $compositeFields | Cache of composite database field |
|
protected | array | $tableNames | Cache of table names |
Methods
An implementation of the factory method, allows you to create an instance of a class
Creates a class instance by the "singleton" design pattern.
Get a configuration accessor for this class. Short hand for Config::inst()->get($this->class, .....).
Gets the uninherited value for the given config option
Given a DataObject class and a field on that class, determine the appropriate SQL for selecting / filtering on in a SQL string. Note that $class must be a valid class, not an arbitrary table.
Returns the root class (the first to extend from DataObject) for the passed class.
Get all DB field specifications for a class, including ancestors and composite fields.
Get specifications for a single class field
Return the complete map of fields to specification on this object, including fixed_fields.
Gets a single database field.
Returns a list of all the composite if the given db field on the class is a composite field.
Get a composite field for a class
Cache all database and composite fields for the given class.
Cache all indexes for the given class. Will do nothing if already cached.
Get "default" database indexable field types
Look for custom indexes declared on the class
Parses a specified column into a sort field and direction
Returns the table name in the class hierarchy which contains a given field column for a DataObject. If the field does not exist, this will return null.
Returns the class name in the class hierarchy which contains a given field column for a DataObject. If the field does not exist, this will return null.
Return information about a specific many_many component. Returns a numeric array.
Parse a belongs_many_many component to extract class and relationship name
Return the many-to-many extra fields specification for a specific component.
Return data for a specific has_many component.
Return data for a specific has_one component.
Check if a has_one relation handles multiple reciprocal has_many relations.
Return data for a specific belongs_to component.
Check class for any unary component
No description
Find a many_many on the child class that points back to this many_many
Tries to find the database key on another object that is used to store a relationship to this class. If no join field can be found it defaults to 'ParentID'.
Validate the to or from field on a has_many mapping class
No description
Validate a given class is valid for a relation
Details
static Injectable
create(mixed ...$args)
An implementation of the factory method, allows you to create an instance of a class
This method will defer class substitution to the Injector API, which can be customised via the Config API to declare substitution classes.
This can be called in one of two ways - either calling via the class directly, or calling on Object and passing the class name as the first parameter. The following are equivalent: $list = DataList::create(SiteTree::class); $list = SiteTree::get();
static Injectable
singleton(string $class = null)
Creates a class instance by the "singleton" design pattern.
It will always return the same instance for this class, which can be used for performance reasons and as a simple way to access instance methods which don't rely on instance data (e.g. the custom SilverStripe static handling).
static Config_ForClass
config()
Get a configuration accessor for this class. Short hand for Config::inst()->get($this->class, .....).
mixed
uninherited(string $name)
Gets the uninherited value for the given config option
reset()
Clear cached table names
array
getTableNames()
Get all table names
string
sqlColumnForField(string $class, string $field, string $tablePrefix = null)
Given a DataObject class and a field on that class, determine the appropriate SQL for selecting / filtering on in a SQL string. Note that $class must be a valid class, not an arbitrary table.
The result will be a standard ANSI-sql quoted string in "Table"."Column" format.
string
tableName(string $class)
Get table name for the given class.
Note that this does not confirm a table actually exists (or should exist), but returns the name that would be used if this table did exist.
DataObject>
baseDataClass(string|object $class)
Returns the root class (the first to extend from DataObject) for the passed class.
string
baseDataTable(string|object $class)
Get the base table
array
fieldSpecs(string|DataObject $classOrInstance, int $options = 0)
Get all DB field specifications for a class, including ancestors and composite fields.
string|null
fieldSpec(string|DataObject $classOrInstance, string $fieldName, int $options = 0)
Get specifications for a single class field
DataObject>|null
tableClass(string $table)
Find the class for the given table
protected
cacheTableNames()
Cache all table names if necessary
protected string
buildTableName(string $class)
Generate table name for a class.
Note: some DB schema have a hard limit on table name length. This is not enforced by this method. See dev/build errors for details in case of table name violation.
array
databaseFields(string $class, bool $aggregated = true)
Return the complete map of fields to specification on this object, including fixed_fields.
"ID" will be included on every table.
string|null
databaseField(string $class, string $field, bool $aggregated = true)
Gets a single database field.
array
databaseIndexes(string $class, bool $aggregated = true)
No description
bool
classHasTable(string $class)
Check if the given class has a table
array
compositeFields(string $class, bool $aggregated = true)
Returns a list of all the composite if the given db field on the class is a composite field.
Will check all applicable ancestor classes and aggregate results.
Can be called directly on an object. E.g. Member::composite_fields(), or Member::composite_fields(null, true) to aggregate.
Includes composite has_one (Polymorphic) fields
string|null
compositeField(string $class, string $field, bool $aggregated = true)
Get a composite field for a class
protected
cacheDatabaseFields(string $class)
Cache all database and composite fields for the given class.
Will do nothing if already cached
protected
cacheDatabaseIndexes($class)
Cache all indexes for the given class. Will do nothing if already cached.
protected array
cacheDefaultDatabaseIndexes(string $class)
Get "default" database indexable field types
protected array
buildCustomDatabaseIndexes(string $class)
Look for custom indexes declared on the class
protected
buildSortDatabaseIndexes($class)
No description
protected array
parseSortColumn(string $column)
Parses a specified column into a sort field and direction
string
tableForField(string $candidateClass, string $fieldName)
Returns the table name in the class hierarchy which contains a given field column for a DataObject. If the field does not exist, this will return null.
DataObject>|null
classForField(string $candidateClass, string $fieldName)
Returns the class name in the class hierarchy which contains a given field column for a DataObject. If the field does not exist, this will return null.
array|null
manyManyComponent(string $class, string $component)
Return information about a specific many_many component. Returns a numeric array.
The first item in the array will be the class name of the relation.
Standard many_many return type is:
[
protected array
parseBelongsManyManyComponent(string $parentClass, string $component, string $specification)
Parse a belongs_many_many component to extract class and relationship name
array|null
manyManyExtraFieldsForComponent(string $class, string $component)
Return the many-to-many extra fields specification for a specific component.
string|null
hasManyComponent(string $class, string $component, bool $classOnly = true)
Return data for a specific has_many component.
string|null
hasOneComponent(string $class, string $component)
Return data for a specific has_one component.
bool
hasOneComponentHandlesMultipleRelations(string $class, string $component)
Check if a has_one relation handles multiple reciprocal has_many relations.
string|null
belongsToComponent(string $class, string $component, bool $classOnly = true)
Return data for a specific belongs_to component.
string|null
unaryComponent(string $class, string $component)
Check class for any unary component
Alias for hasOneComponent() ?: belongsToComponent()
protected array
parseManyManyComponent(string $parentClass, string $component, string|array $specification)
No description
protected string|null
getManyManyInverseRelationship(string $childClass, string $parentClass)
Find a many_many on the child class that points back to this many_many
string
getRemoteJoinField(string $class, string $component, string $type = 'has_many', bool $polymorphic = false)
Tries to find the database key on another object that is used to store a relationship to this class. If no join field can be found it defaults to 'ParentID'.
If the remote field is polymorphic then $polymorphic is set to true, and the return value is in the form 'Relation' instead of 'RelationID', referencing the composite DBField.
array
getHasManyComponentDetails(string $class, string $component)
No description
protected string
checkManyManyFieldClass(string $parentClass, string $component, string $joinClass, array $specification, string $key)
Validate the to or from field on a has_many mapping class
protected string
checkManyManyJoinClass(string $parentClass, string $component, array $specification)
No description
protected
checkRelationClass(string $class, string $component, string $relationClass, string $type)
Validate a given class is valid for a relation