Skip to content

Commit

Permalink
About to make some sweeping changes to relations.
Browse files Browse the repository at this point in the history
  • Loading branch information
KrisJordan committed Dec 9, 2008
1 parent 7dbea98 commit 6a5ad27
Show file tree
Hide file tree
Showing 10 changed files with 253 additions and 23 deletions.
168 changes: 168 additions & 0 deletions GreatModelDebate.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
<?php
// Railsian

/**
* !HasMany tags, Through: TagsPosts
* !BelongsTo author, Class: Person
*/
class Post { }

/**
* !HasMany posts
*/
class Person { }

/**
* !HasMany posts, Through: TagsPosts
*/
class Tag { }

/**
* !BelongsTo post
* !BelongsTo tag
*/
class TagsPosts { }

/**
* !HasMany classes, Class: RecessReflectorClass,Key: packageId
* !HasMany children, Class: RecessReflectorPackage,Key: parentId
* !BelongsTo parent, Class: RecessReflectorPackage,Key: parentId
* !Table packages
*/
class RecessReflectorPackage extends Model { }

//////////////
// Djangonian
//////////////

class Post {
/** !ForeignKey author, Class: Person */
public $authorId;
}

class Person { }

class Tag { }

class TagsPosts {
/** !ForeignKey post */
public $postId;

/** !ForeignKey tag */
public $tag;
}

/**
* !Table packages
*/
class RecessReflectorPackage extends Model {
/** !Column Integer */
/** !ForeignKey parent, Class: RecessReflectorPackage, RelatedName: children */
public $parentId;
}

$post->tagSet();

//////////////
// Recess'ian
//////////////

class Post {
/** !ForeignKey author, Class: Person */
public $authorId;
}

/** !Many people */
class Person { }

/** !Many tags */
class Tag { }

class TagsPosts {
/** !ForeignKey RelatedName: tags, JoinThrough: tag */
public $postId;

/**
* !ForeignKey Class: Post
*/
public $oldPostId;

/** !ForeignKey tag, Class: Tag, RelatedName: posts, JoinThrough: post */
public $tagId;
}








/**
* Plural: posts
*/
class Post extends Model {

/** !Column PrimaryKey, Integer, AutoIncrement */
public $id;

/** !Column Boolean */
public $isHistorical;

/** !Column String */
public $title;

/** !Column Text */
public $body;

/**
* !Column Integer
* !ForeignKey Post, RelatedName: versions
*/
public $originalId;

/**
* !Column Integer
* !ForeignKey Name: author, Class: User
*/
public $writerId;

/**
* !Column Integer
* !ForeignKey
*/
public $categoryId;

}

/** !Plural: users */
class User extends Model {

}
















/**
* !Table packages
*/
class RecessReflectorPackage extends Model {
/** !Column Integer */
/** !ForeignKey parent, Class: RecessReflectorPackage, RelatedName: children */
public $parentId;
}


?>
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
Library::import('recess.apps.ide.models.RecessReflectorClassMethods');

/**
* !BelongsTo package, Class: RecessReflectorPackage, ForeignKey: packageId
* !BelongsTo parent, Class: RecessReflectorClass, ForeignKey: parentId
* !HasMany children, Class: RecessReflectorClass, ForeignKey: parentId
* !BelongsTo package, Class: RecessReflectorPackage,Key: packageId
* !BelongsTo parent, Class: RecessReflectorClass,Key: parentId
* !HasMany children, Class: RecessReflectorClass, Key: parentId
* !Table classes
*/
class RecessReflectorClass extends Model {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
Library::import('recess.database.orm.Model');

/**
* !HasMany classes, Class: RecessReflectorClass, ForeignKey: packageId
* !HasMany children, Class: RecessReflectorPackage, ForeignKey: parentId
* !BelongsTo parent, Class: RecessReflectorPackage, ForeignKey: parentId
* !HasMany classes, Class: RecessReflectorClass,Key: packageId
* !HasMany children, Class: RecessReflectorPackage,Key: parentId
* !BelongsTo parent, Class: RecessReflectorPackage,Key: parentId
* !Table packages
*/
class RecessReflectorPackage extends Model {
Expand Down
3 changes: 1 addition & 2 deletions recess/lib/recess/database/orm/Model.class.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
<?php
Library::import('recess.lang.Inflector');
Library::import('recess.lang.RecessObject');
Library::import('recess.lang.RecessReflectionClass');
Library::import('recess.lang.Annotation');
Expand Down Expand Up @@ -267,7 +266,7 @@ class ModelDescriptor extends RecessObjectDescriptor {
public $source;

function __construct($class, $loadColumns = true) {
$this->table = Inflector::toPlural(Inflector::toUnderscores($class));
$this->table = ModelConventions::tableNameFromClass($class);
$this->relationships = array();
$this->properties = array();
$this->source = false;
Expand Down
70 changes: 70 additions & 0 deletions recess/lib/recess/database/orm/ModelConventions.class.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
<?php

class ModelConventions {

// To provide your own naming conventions override these methods:

static final function setConventions(ModelConventions $instance) {
self::$instance = $instance;
}

protected function myTableNameFromClass($class) {
return strtolower($class);
}

protected function myRelatedClassFromBelongsToName($belongsToName) {
return ucfirst($belongsToName);
}

protected function myRelatedForeignKeyFromBelongsToName($belongsToName) {
return $belongsToName . 'Id';
}

protected function myRelatedClassFromHasManyName($hasManyName) {
return ucfirst($hasManyName);
}

protected function myRelatedForeignKeyFromHasManyModelName($modelName) {
if($modelName != '') {
$modelName[0] = strtolower($modelName[0]);
}
return $modelName . 'Id';
}

// End overrideable methods.

protected $instance;

protected function __construct() {}

static final function init() {
self::$instance = new ModelConventions();
}

static final function tableNameFromClass($class) {
return self::$instance->myTableNameFromClass($class);
}

static final function relatedClassFromBelongsToName($belongsToName) {
return self::$instance->myRelatedClassFromBelongsToName($belongsToName);
}

static final function relatedForeignKeyFromBelongsToName($belongsToName) {
return self::$instance->myRelatedForeignKeyFromBelongsToName($belongsToName);
}

static final function relatedClassFromHasManyName($hasManyName) {
return self::$instance->myRelatedClassFromHasManyName($hasManyName);
}

static final function relatedForeignKeyFromHasManyClass($class) {
return self::$instance->myRelatedForeignKeyFromHasManyClass($class);
}




}
ModelConventions::init();

?>
7 changes: 0 additions & 7 deletions recess/lib/recess/database/orm/ModelSet.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,6 @@ class ModelSet extends PdoDataSet {

function __call($name, $arguments) {
$relationship = Model::getRelationship($this->rowClass, $name);
if($relationship === false && Inflector::isPlural($name)) {
$name = Inflector::toSingular($name);
$relationship = Model::getRelationship($this->rowClass, $name);
if(!$relationship instanceof BelongsToRelationship) {
$relationship = false;
}
}

if($relationship !== false) {
return $relationship->selectModelSet($this);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ function init($modelClassName, $relationshipName) {
$this->localClass = $modelClassName;
$this->name = $relationshipName;
$this->onDelete = Relationship::NULLIFY;
$this->foreignKey = Inflector::toUnderscores($relationshipName) . '_id';
$this->foreignClass = Inflector::toProperCaps($relationshipName);
$this->foreignKey = ModelConventions::relatedForeignKeyFromBelongsToName($relationshipName);
$this->foreignClass = ModelConventions::relatedClassFromBelongsToName($relationshipName);
}

function attachMethodsToModelDescriptor(ModelDescriptor &$descriptor) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ function getType() {
function init($modelClassName, $relationshipName) {
$this->localClass = $modelClassName;
$this->name = $relationshipName;
$this->foreignKey = Inflector::toUnderscores($modelClassName) . '_id';
$this->foreignClass = Inflector::toSingular(Inflector::toProperCaps($relationshipName));
$this->foreignClass = ModelConventions::relatedClassFromHasManyName($relationshipName);
$this->foreignKey = ModelConventions::relatedForeignKeyFromHasManyClass($modelClassName);
$this->onDelete = Relationship::UNSPECIFIED;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?php

abstract class Relationship {
const FOREIGN_KEY = 'foreignkey';
const FOREIGN_KEY = 'key';
const FOREIGN_CLASS = 'class';
const THROUGH = 'through';
const ON_DELETE = 'ondelete';
Expand Down
6 changes: 3 additions & 3 deletions recess/test/lib/recess/database/orm/ModelTest.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
Library::import('recess.database.orm.ModelDataSource');

/**
* !BelongsTo owner, Class: Person, ForeignKey: person_id, OnDelete: Cascade
* !BelongsTo owner, Class: Person, Key: person_id, OnDelete: Cascade
*/
class Car extends Model {

Expand Down Expand Up @@ -35,8 +35,8 @@ class Group extends Model {}
class Groupship extends Model {}

/**
* !HasMany books, ForeignKey: author_id, OnDelete: Cascade
* !HasMany novels, ForeignKey: author_id, Class: Book
* !HasMany books, Key: author_id, OnDelete: Cascade
* !HasMany novels, Key: author_id, Class: Book
* !HasMany cars, OnDelete: Nullify
* !HasMany groups, Through: Groupship, OnDelete: Nullify
* !BelongsTo politicalParty
Expand Down

0 comments on commit 6a5ad27

Please sign in to comment.