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

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.

Properties

static private string $table_namespace_separator

Default separate for table namespaces. Can be set to any string for databases that do not support some characters.

Methods

static Injectable
create(array ...$args)

An implementation of the factory method, allows you to create an instance of a class

static Injectable
singleton(string $class = null)

Creates a class instance by the "singleton" design pattern.

static Config_ForClass
config()

Get a configuration accessor for this class. Short hand for Config::inst()->get($this->class, .....).

mixed
stat(string $name) deprecated

Get inherited config value

mixed
uninherited(string $name)

Gets the uninherited value for the given config option

$this
set_stat(string $name, mixed $value) deprecated

Update the config value for a given property

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.

string
tableName(string $class)

Get table name for the given class.

string
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

string|null
tableClass(string $table)

Find the class for the given table

array
databaseFields(string $class, bool $aggregated = true)

Return the complete map of fields to specification on this object, including fixed_fields.

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.

string|null
compositeField(string $class, string $field, bool $aggregated = true)

Get a composite field for a class

string
tableForField(string $candidateClass, string $fieldName)

Returns the table name in the class hierarchy which contains a given field column for a {@link DataObject}. If the field does not exist, this will return null.

string
classForField(string $candidateClass, string $fieldName)

Returns the class name in the class hierarchy which contains a given field column for a {@link 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.

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.

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

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'.

Details

static Injectable create(array ...$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'); $list = SiteTree::get();

Parameters

array ...$args

Return Value

Injectable

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).

Parameters

string $class

Optional classname to create, if the called class should not be used

Return Value

Injectable

The singleton instance

static Config_ForClass config()

Get a configuration accessor for this class. Short hand for Config::inst()->get($this->class, .....).

Return Value

Config_ForClass

mixed stat(string $name) deprecated

deprecated 5.0 Use ->config()->get() instead

Get inherited config value

Parameters

string $name

Return Value

mixed

mixed uninherited(string $name)

Gets the uninherited value for the given config option

Parameters

string $name

Return Value

mixed

$this set_stat(string $name, mixed $value) deprecated

deprecated 5.0 Use ->config()->set() instead

Update the config value for a given property

Parameters

string $name
mixed $value

Return Value

$this

reset()

Clear cached table names

array getTableNames()

Get all table names

Return Value

array

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.

Parameters

string $class

Class name (not a table).

string $field

Name of field that belongs to this class (or a parent class)

string $tablePrefix

Optional prefix for table (alias)

Return Value

string

The SQL identifier string for the corresponding column for this field

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.

Parameters

string $class

Return Value

string

Returns the table name, or null if there is no table

string baseDataClass(string|object $class)

Returns the root class (the first to extend from DataObject) for the passed class.

Parameters

string|object $class

Return Value

string

Exceptions

InvalidArgumentException

string baseDataTable(string|object $class)

Get the base table

Parameters

string|object $class

Return Value

string

array fieldSpecs(string|DataObject $classOrInstance, int $options = 0)

Get all DB field specifications for a class, including ancestors and composite fields.

Parameters

string|DataObject $classOrInstance
int $options

Bitmask of options

  • UNINHERITED Limit to only this table
  • DB_ONLY Exclude virtual fields (such as composite fields), and only include fields with a db column.
  • INCLUDE_CLASS Prefix the field specification with the class name in RecordClass.Column(spec) format.

Return Value

array

List of fields, where the key is the field name and the value is the field specification.

string|null fieldSpec(string|DataObject $classOrInstance, string $fieldName, int $options = 0)

Get specifications for a single class field

Parameters

string|DataObject $classOrInstance

Name or instance of class

string $fieldName

Name of field to retrieve

int $options

Bitmask of options

  • UNINHERITED Limit to only this table
  • DB_ONLY Exclude virtual fields (such as composite fields), and only include fields with a db column.
  • INCLUDE_CLASS Prefix the field specification with the class name in RecordClass.Column(spec) format.

Return Value

string|null

Field will be a string in FieldClass(args) format, or RecordClass.FieldClass(args) format if using INCLUDE_CLASS. Will be null if no field is found.

string|null tableClass(string $table)

Find the class for the given table

Parameters

string $table

Return Value

string|null

The FQN of the class, or null if not found

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.

Parameters

string $class

Class name to query from

bool $aggregated

Include fields in entire hierarchy, rather than just on this table

Return Value

array

Map of fieldname to specification, similiar to {@link DataObject::$db}.

string|null databaseField(string $class, string $field, bool $aggregated = true)

Gets a single database field.

Parameters

string $class

Class name to query from

string $field

Field name

bool $aggregated

Include fields in entire hierarchy, rather than just on this table

Return Value

string|null

Field specification, or null if not a field

array databaseIndexes(string $class, bool $aggregated = true)

Parameters

string $class
bool $aggregated

Return Value

array

bool classHasTable(string $class)

Check if the given class has a table

Parameters

string $class

Return Value

bool

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

Parameters

string $class

Name of class to check

bool $aggregated

Include fields in entire hierarchy, rather than just on this table

Return Value

array

List of composite fields and their class spec

string|null compositeField(string $class, string $field, bool $aggregated = true)

Get a composite field for a class

Parameters

string $class

Class name to query from

string $field

Field name

bool $aggregated

Include fields in entire hierarchy, rather than just on this table

Return Value

string|null

Field specification, or null if not a field

string tableForField(string $candidateClass, string $fieldName)

Returns the table name in the class hierarchy which contains a given field column for a {@link DataObject}. If the field does not exist, this will return null.

Parameters

string $candidateClass
string $fieldName

Return Value

string

string classForField(string $candidateClass, string $fieldName)

Returns the class name in the class hierarchy which contains a given field column for a {@link DataObject}. If the field does not exist, this will return null.

Parameters

string $candidateClass
string $fieldName

Return Value

string

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:

[

, Name of class for relation. E.g. "Categories" , The class that relation is defined in e.g. "Product" , The target class of the relation e.g. "Category" , The field name pointing to 's table e.g. "ProductID". , The field name pointing to 's table e.g. "CategoryID". The join table between the two classes e.g. "Product_Categories". If the class name is 'ManyManyThroughList' then this is the name of the has_many relation. ]

Parameters

string $class

Name of class to get component for

string $component

The component name

Return Value

array|null

array|null manyManyExtraFieldsForComponent(string $class, string $component)

Return the many-to-many extra fields specification for a specific component.

Parameters

string $class
string $component

Return Value

array|null

string|null hasManyComponent(string $class, string $component, bool $classOnly = true)

Return data for a specific has_many component.

Parameters

string $class

Parent class

string $component
bool $classOnly

If this is TRUE, than any has_many relationships in the form "ClassName.Field" will have the field data stripped off. It defaults to TRUE.

Return Value

string|null

string|null hasOneComponent(string $class, string $component)

Return data for a specific has_one component.

Parameters

string $class
string $component

Return Value

string|null

string|null belongsToComponent(string $class, string $component, bool $classOnly = true)

Return data for a specific belongs_to component.

Parameters

string $class
string $component
bool $classOnly

If this is TRUE, than any has_many relationships in the form "ClassName.Field" will have the field data stripped off. It defaults to TRUE.

Return Value

string|null

string|null unaryComponent(string $class, string $component)

Check class for any unary component

Alias for hasOneComponent() ?: belongsToComponent()

Parameters

string $class
string $component

Return Value

string|null

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.

Parameters

string $class
string $component

Name of the relation on the current object pointing to the remote object.

string $type

the join type - either 'has_many' or 'belongs_to'

bool $polymorphic

Flag set to true if the remote join field is polymorphic.

Return Value

string

Exceptions

Exception