ATK Relations
A relation defines a relation between two tables. One or more records in the first table belong to one or more records in the second table. A one to many relation would be '1 library has N books'.
atkOneToOneRelation
An atkOneToOneRelation defines a relation between two tables where there is one record in the first table that belongs to one record in the second table.
The atkOneToOneRelation supports two configurations: master mode and slave mode. The mode to use is detected automatically based on the value of the $refKey parameter.
function atkOneToOneRelation($name, $destination, $refKey="", $flags=0)
- $name: The unique name of the attribute.
- $destination: the destination node (in module.nodename notation)
- $refKey: foreign-key field (master mode) or empty (slave mode)
Master mode example
The node in which the relation is implemented, is considered the master (code is in node A). And the referential key pointing to the master record (a_id) is in the destination node (node B).

Referential key a_id is in the other node, so this is the master-configuration.
Slave mode example
The node in which the relation is implemented (code is in node B), is considered the child. And the referential key pointing to the master record (a_id) is in the current node (node B).

Referential key a_id is in the same node, so this is the slave-configuration.
atkOneToManyRelation
function atkOneToManyRelation($name, $destination, $refKey="", $flags=0)
- $name The unique name of this relation within a node - In contrast with moth other attributes, the name does not correspond to a database field. This is because in one2many relations, the databasefield that stores the link, is in the destination node (B) and not in the owner node (A)
- $destination The node to which the relationship is made
- $refKey For regular oneToMany relationships, $refKey is name of the referential key in the destination node. In the case of multi-foreign key relationships, $refKey can be an array of fields.
Example
Suppose a department (node A) has many employees (node B). To edit the list of employees in a department, this relationship can be built with an atkOneToManyRelation. Each employee gets a department_id (a_id).

atkManyToOneRelation
function atkManyToOneRelation($name, $destination, $flags=0)
- $name The name of the attribute.
- $destination The node we have a relationship with.
Example
Projects all have one coordinator (node B), but one coordinator can have multiple projects (node A). So in the project class, there's a atkManyToOneRelation to a coordinator.

Many-To-Many-Relation
This relation can be created with an intermediate table to store the relations.
A Many-To-Many-Relation basically consist of a atkOneToMany relation to the intermediate table. The intermediate node has two atkManyToOne relations defined.
Example
One person (node A) can have several skills (node B) and the same skill applies to more than one person.

If, in the example above, a skill is removed, this skill must be removed for all employees. This can be achieved by adding the AF_CASCADE_DELETE flag to the atkOneToManyRelation in node B:
atkOneToMany(“unique dummy”,
“mymod.A_B”,
“b_id”,
AF_HIDE|AF_CASCADE_DELETE);
Normally you assign skills to a person (an not the other way round), so the atkOneToManyRelation in this node must be hidden.
And on the other hand, if an employee is deleted, the correspoding record(s) in the intermediate table must be removed as well.
atkOneToMany(“unique dummy”,
“mymod.A_B”,
“a_id”,
AF_CASCADE_DELETE);
Be careful when using the AF_HIDE flag in the itermediate (A_B) node for the atkManyToOneRelation, in combination with multilanguage fields. When a relation is hidden, the key (a_id) will not be processed and no check on the language is done. This causes the added record to appear multiple times (once for every language), since a_id is not unique in the intermediate table.
atkManyBoolRelation
Document me!
atkManyToOneTreeRelation
The atkManyToOneTree relation will build a dropdown that looks like:
Record A
Record B
Record C
Record D
Record E
Record F
It could be used together with atkTreeNode with ATK_Attribute_Flags.
atkMatrixRelation
Document me!
atkSecureRelation
Document me!
atkShuttleRelation
Document me!