# Types
OData specifies many primitive types (opens new window) that can be used in Lodata:
Type | Meaning |
---|---|
Edm.Binary | Binary data |
Edm.Boolean | Binary-valued logic |
Edm.Byte | Unsigned 8-bit integer |
Edm.Date | Date without a time-zone offset |
Edm.DateTimeOffset | Date and time with a time-zone offset, no leap seconds |
Edm.Decimal | Numeric values with decimal representation |
Edm.Double | IEEE 754 binary64 floating-point number (15-17 decimal digits) |
Edm.Duration | Signed duration in days, hours, minutes, and (sub)seconds |
Edm.Guid | 16-byte (128-bit) unique identifier |
Edm.Int16 | Signed 16-bit integer |
Edm.Int32 | Signed 32-bit integer |
Edm.Int64 | Signed 64-bit integer |
Edm.SByte | Signed 8-bit integer |
Edm.Single | IEEE 754 binary32 floating-point number (6-9 decimal digits) |
Edm.Stream | Binary data stream |
Edm.String | Sequence of characters |
Edm.TimeOfDay | Clock time 00:00-23:59:59.999999999999 |
PHP's type system is less specific than OData. For example where PHP only has int
, OData has Edm.Byte
, Edm.Int16
, Edm.Int32
and Edm.Int64
.
Marshalling between PHP and OData types is automatic via conversion and coercion.
Lodata will force PHP data into the type specified by the developer, for example converting a 64-bit PHP int
to
an OData Edm.Int16
may cause truncation or overflow. When a client receives the property it will be of the expected type. In general,
it's best to use Edm.Int64
for PHP values and for backend services like databases the matching EDM type for the property can be specified in
the entity type.
PHP supports higher precision floating point values than JSON, so Lodata implements
IEEE754 compatibility (opens new window) in OData by returning
Edm.Double
(and similar) types as strings if requested to do so by the client in the Accept
header.
Lodata implements Edm.Date
, Edm.DateTimeOffset
and Edm.TimeOfDay
using immutable Carbon (opens new window)
objects, and retrieving the value of (eg) a \Flat3\Lodata\Type\DateTimeOffset
using its get()
method will return a Carbon\CarbonImmutable
.
The Edm.Duration
type is stored internally as a number of seconds in a PHP float.
Lodata supports Collection and Enumeration types.
# Type extensions
Lodata includes type extensions to support unsigned integer types UInt16
, UInt32
and UInt64
which are
extensions of the underlying canonical types Edm.Int16
, Edm.Int32
and Edm.Int64
.
These type definitions are not in the default model as not all OData clients interpret them correctly. If the application developer adds them they will be used during automatic entity type property detection.
To add one or more of these types, use Lodata::add()
to add a new PrimitiveType
passing in the class type name:
class LodataServiceProvider extends ServiceProvider
{
public function boot()
{
\Lodata::add(new \Flat3\Lodata\PrimitiveType(\Flat3\Lodata\Type\UInt16::class))
}
}
2
3
4
5
6
7
# Type discovery
Lodata supports changing a property's type after definition or discovery using a call such as:
class LodataServiceProvider extends ServiceProvider
{
public function boot()
{
\Lodata::getEntityType('Flight')
->getProperty('duration')
->setType(\Flat3\Lodata\Type::uint32());
}
}
2
3
4
5
6
7
8
9
# Open Types
Open entity types and open complex types allow properties to be added dynamically to instances of the open type. This is useful when working with entity set types such as Redis or Mongo.
An entity type may indicate that it is open and allow clients to add properties dynamically to instances of the type by specifying uniquely named property values in the payload used to insert or update an instance of the type.
Some entity types are open by default, such as RedisEntityType
and MongoEntityType
. Lodata supports changing
a property's open flag:
class LodataServiceProvider extends ServiceProvider
{
public function boot()
{
$type = new RedisEntityType('example');
$type->setOpen(false);
$set = new RedisEntitySet('examples', $type);
Lodata::add($set);
}
}
2
3
4
5
6
7
8
9
10
# Immutable properties
Lodata supports annotating a property as Immutable
meaning that it can be provided as part of a create request, but
will be ignored during an update request.
class LodataServiceProvider extends ServiceProvider
{
public function boot()
{
$entityType = new \Flat3\Lodata\EntityType('example');
$entityType->setKey(new \Flat3\Lodata\DeclaredProperty('id', \Flat3\Lodata\Type::string()));
$entityType->addDeclaredProperty('name', \Flat3\Lodata\Type::string());
$dob = new \Flat3\Lodata\DeclaredProperty('dob', \Flat3\Lodata\Type::date());
$dob->addAnnotation(new \Flat3\Lodata\Annotation\Core\V1\Immutable);
$entityType->addProperty($dob);
$entitySet = new \Flat3\Lodata\Drivers\CollectionEntitySet('examples', $entityType);
$entitySet->setCollection($collection);
\Lodata::add($entitySet);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15