Revision #6 has been created by Jorgee on Aug 20, 2013, 3:48:30 PM with the memo:
Added another example.
« previous (#4) next (#7) »
Relations: BELONGS_TO versus HAS_ONE
relations, HAS_ONE, BELONGS_TO
**KEY POINT**: A `BELONGS_TO` relation says that a field in **this** model points to the primary key in **another** model; in this case, _the current model owns the linking field_.
**KEY POINT**: A `HAS_ONE` relation says that some **other** model has a linking field pointing to **this** model's primary key; in this case, _the related model owns the linking field_.
Let's put these in context (numbered for reference)
// Post model relations
1. 'user' => array(self::BELONGS_TO, 'User', 'user_id'),
// Profile model relations
2. 'user' => array(self::BELONGS_TO, 'User', 'user_id'),
// User model relations
3. 'posts' => array(self::HAS_MANY, 'Post', 'user_id'),
4. 'profile' => array(self::HAS_ONE, 'Profile', 'user_id'),
Relations 1 has the linking field `user_id` in **this** model, pointing to the primary key of the **related** model `User`. Likewise with relation #2.
Relations 3 and 4 are essentially the same thing as each other: the linking field `user_id` is not in **this** model, but in the **related** model, and the primary key involved is in **this** model (`User`). The difference is that `HAS_MANY` returns an array of possibly multiple objects, while `HAS_ONE` returns a single object.
[...]`HAS_ONE` is just a special case of `HAS_MANY`, and the circumstances where `HAS_ONE` makes sense are far more limited than `HAS_MANY` and `BELONGS_TO`.
Some points to remember:
* When defining one of these relations, you don't ever name the primary key; Yii figures it out from the DB schema
* `BELONGS_TO` is where **this** model owns the linking field
* `BELONGS_TO` references the **related** model's primary key
* `HAS_ONE`/`HAS_MANY` is where the **related** model owns the linking field