예제 #1
0
 /**
  * Construct new Join Association.
  *
  * @param   object  $reflection
  * @param   object  $joinDependency
  * @param   object  $parent
  */
 public function __construct(Mad_Model_Association_Base $reflection, Mad_Model_Join_Dependency $joinDependency, Mad_Model_Join_Base $parent)
 {
     parent::__construct($reflection->getAssocModel());
     $this->_parent = $parent;
     $this->_reflection = $reflection;
     $this->_aliasedPrefix = 'T' . sizeof($joinDependency->joins());
     $this->_aliasedTableName = $this->tableName();
     // start with table name
     $this->_parentTableName = $parent->model()->tableName();
     // if the table name has been used, then use an alias
     $alias = $this->_aliasedTableName;
     if ($joinDependency->tableAlias($this->_aliasedTableName)) {
         $alias = $reflection->getAssocTable() . "_{$this->_parentTableName}";
         $this->_aliasedTableName = $this->_model->connection->tableAliasFor($alias);
         // make sure to get a unique name. careful of name restrictions
         $alias = $this->_aliasedTableName;
         $i = $joinDependency->tableAlias($alias);
         if ($i > 0) {
             $maxLen = $this->_model->connection->tableAliasLength() - 3;
             $this->_aliasedTableName = substr($this->_aliasedTableName, 0, $maxLen) . "_" . ($i + 1);
         }
     }
     $joinDependency->addTableAlias($alias);
     // create alias for join table (only should be executed for hasAndBelongsToMany|belongsTo
     if ($this->_aliasedJoinTableName = $this->_reflection->getJoinTable()) {
         if ($joinDependency->tableAlias($this->_aliasedJoinTableName)) {
             $alias = $reflection->getAssocTable() . '_' . $this->_parentTableName . '_join';
             $this->_aliasedJoinTableName = $this->_model->connection->tableAliasFor($alias);
             // make sure to get a unique name. careful of oracle name restrictions
             $i = $joinDependency->tableAlias($this->_aliasedJoinTableName);
             if ($i > 0) {
                 $maxLen = $this->_model->connection->tableAliasLength() - 3;
                 $this->_aliasedJoinTableName = substr($this->_aliasedJoinTableName, 0, $maxLen) . "_" . ($i + 1);
             }
         }
         $joinDependency->addTableAlias($this->_aliasedJoinTableName);
     }
 }
예제 #2
0
 public function testInstantiateHasManyBelongsToHash()
 {
     // this is 4 docs in 2 folders
     $rows = array(array('T0_R0' => '1', 'T1_R0' => '1', 'T2_R0' => '9'), array('T0_R0' => '1', 'T1_R0' => '2', 'T2_R0' => '9'), array('T0_R0' => '2', 'T1_R0' => '3', 'T2_R0' => '9'), array('T0_R0' => '2', 'T1_R0' => '4', 'T2_R0' => '9'));
     $d = new Mad_Model_Join_Dependency(new User(), array('Articles' => 'Comments'));
     $users = $d->instantiate($rows);
     // make sure it made 2 folders
     $this->assertEquals(2, count($users));
     // each is a folder
     foreach ($users as $user) {
         $this->assertTrue($user instanceof User);
         $this->assertEquals(2, count($user->articles));
         foreach ($user->articles as $article) {
             $this->assertTrue($article instanceof Article);
             $this->assertTrue($article->comments[0] instanceof Comment);
         }
     }
 }
예제 #3
0
 public function testAssociationJoinHasAndBelongsToMany()
 {
     $joinDep = new Mad_Model_Join_Dependency(new Category(), 'Articles');
     $associations = $joinDep->joinAssociations();
     $joinAssoc = array_shift($associations);
     $joinStr = $joinAssoc->associationJoin();
     $expected = " LEFT OUTER JOIN articles_categories" . " ON articles_categories.category_id = categories.id " . " LEFT OUTER JOIN articles" . " ON articles.id = articles_categories.article_id ";
     $this->assertEquals($expected, $joinStr);
 }