Active Record Associations in the PHPonTRAX framework.

Active Record Table Associations

belongs_to / has_one

Both express a 1-1 relationship, the difference is mostly where to place the foreign key, which goes on the table for the class saying belongs_to. For belongs_to the foreign key from another table is in this table. For has_one there is a foreign key in another table to this table. Association names should be singular for both assoiation types.

Example:

class Post extends ActiveRecord {
    public $has_one = "author"; # <= singular name
}

class Author extends ActiveRecord {
    public $belongs_to = "post"; # <= singular name
}

The tables for these classes could look something like:

  CREATE TABLE posts (
    id int(11) NOT NULL auto_increment,
    title varchar default NULL,
    PRIMARY KEY  (id)
  )

  CREATE TABLE authors (
    id int(11) NOT NULL auto_increment,
    post_id int(11) default NULL,
    name varchar default NULL,
    PRIMARY KEY  (id)
  )

has_many

This expresses a 1-M relationship. There should be a foreign key in another table to this table where there are many records in that table linking to this table. Association names should be plural

Example:

class User extends ActiveRecord {
    public $has_many = "notes"; # <= plural name
}

class Note extends ActiveRecord {
    public $belongs_to = "user";  # <= singular name  
}

The tables for these classes could look something like:

  CREATE TABLE users (
    id int(11) NOT NULL auto_increment,
    fist_name varchar default NULL,
    last_name varchar default NULL,
    PRIMARY KEY  (id)
  )

  CREATE TABLE notes (
    id int(11) NOT NULL auto_increment,
    user_id int(11) default NULL,
    note_text text default NULL,
    PRIMARY KEY  (id)
  )

has_and_belongs_to_many ( habtm )

This expresses a M-M relationship. There should be three tables. Two tables with a third joining table. Association names should be plural. The joining table name must be named table1_table2plural names for both in alphabetical order

Example:

class Product extends ActiveRecord {
    public $has_and_belongs_to_many = "categories"; # <= plural name
}

class Category extends ActiveRecord {
    public $has_and_belongs_to_many = "products"; # <= plural name  
}

The tables for these classes could look something like:

  CREATE TABLE products (
    id int(11) NOT NULL auto_increment,
    sku varchar default NULL,
    name varchar default NULL,
    price DECIMAL(9,2) NOT NULL,
    PRIMARY KEY  (id)
  )

  CREATE TABLE categories (
    id int(11) NOT NULL auto_increment,
    name varchar default NULL,
    PRIMARY KEY  (id)
  )

  CREATE TABLE categories_products (
    category_id int(11) NOT NULL auto_increment,
    product_id int(11) default NOT NULL
  )

Notes

If you need to define more that one of any of the above associations in the same model class, you can do the following:

public $belongs_to = "assoc1,assoc2,assoc3,etc....";  

If you need to specify additional parameters with the association beside just the name you will have to define it as follows:

public $belongs_to = array("assoc1" => array("foreign_key"=> "weird_key"),
                           "assoc2" => null,
                           "assoc3" => array("conditions" => "age > 25"),
                           etc ...
                          );