function rewind()
 {
     foreach ($this->attach_relations as $relation_name => $params) {
         if (!in_array($relation_name, array_keys($this->loaded_attaches))) {
             $relation_type = $this->base_object->getRelationType($relation_name);
             $relation_info = $this->base_object->getRelationInfo($relation_name);
             $relation_class = $relation_info['class'];
             $relation_object = new $relation_class(null, $this->conn);
             switch ($relation_type) {
                 case lmbActiveRecord::HAS_ONE:
                 case lmbActiveRecord::MANY_BELONGS_TO:
                     $ids = lmbArrayHelper::getColumnValues($this->prefix . $relation_info['field'], $this->iterator);
                     if (!count($ids)) {
                         $this->loaded_attaches[$relation_name] = array();
                     } else {
                         $attached_objects = lmbActiveRecord::findByIds($relation_class, $ids, $params, $this->conn);
                         $this->loaded_attaches[$relation_name] = lmbCollection::toFlatArray($attached_objects, $key_field = $relation_object->getPrimaryKeyName(), $export_each = false);
                     }
                     break;
                 case lmbActiveRecord::BELONGS_TO:
                     $ids = lmbArrayHelper::getColumnValues($this->prefix . $this->base_object->getPrimaryKeyName(), $this->iterator);
                     if (!count($ids)) {
                         $this->loaded_attaches[$relation_name] = array();
                     } else {
                         $criteria = lmbSQLCriteria::in($relation_info['field'], $ids);
                         $params['criteria'] = isset($params['criteria']) ? $params['criteria']->addAnd($criteria) : $criteria;
                         $attached_objects = lmbActiveRecord::find($relation_class, $params, $this->conn);
                         $this->loaded_attaches[$relation_name] = lmbCollection::toFlatArray($attached_objects, $key_field = $relation_info['field'], $export_each = false);
                     }
                     break;
                 case lmbActiveRecord::HAS_MANY:
                     if (!isset($params['sort'])) {
                         $params['sort'] = $relation_object->getDefaultSortParams();
                     }
                     $params['sort'] = array($relation_info['field'] => 'ASC') + $params['sort'];
                     $query = lmbAROneToManyCollection::createFullARQueryForRelation($relation_info, $this->conn, $params);
                     $ids = lmbArrayHelper::getColumnValues($this->prefix . $this->base_object->getPrimaryKeyName(), $this->iterator);
                     $this->loaded_attaches[$relation_name] = array();
                     if (!count($ids)) {
                         break;
                     }
                     $query->addCriteria(lmbSQLCriteria::in($relation_info['field'], $ids));
                     $attached_objects = $query->fetch();
                     foreach ($attached_objects as $attached_object) {
                         $this->loaded_attaches[$relation_name][$attached_object->get($relation_info['field'])][] = $attached_object;
                     }
                     break;
                 case lmbActiveRecord::HAS_MANY_TO_MANY:
                     if (!isset($params['sort'])) {
                         $params['sort'] = $relation_object->getDefaultSortParams();
                     }
                     $params['sort'] = array($relation_info['field'] => 'ASC') + $params['sort'];
                     $query = lmbARManyToManyCollection::createFullARQueryForRelation($relation_info, $this->conn, $params);
                     $query->addField($relation_info['table'] . '.' . $relation_info['field'], "link__id");
                     $ids = lmbArrayHelper::getColumnValues($this->prefix . $this->base_object->getPrimaryKeyName(), $this->iterator);
                     $this->loaded_attaches[$relation_name] = array();
                     if (!count($ids)) {
                         break;
                     }
                     $query->addCriteria(lmbSQLCriteria::in($relation_info['field'], $ids));
                     $attached_objects = $query->fetch();
                     foreach ($attached_objects as $attached_object) {
                         $this->loaded_attaches[$relation_name][$attached_object->get("link__id")][] = $attached_object;
                     }
                     break;
             }
         }
     }
     parent::rewind();
 }
예제 #2
0
 function testFetchNested_AttachProperty_In_JoinProperty_In_Attach()
 {
     $course1 = $this->creator->createCourse();
     $course2 = $this->creator->createCourse();
     $alt_course1 = $this->creator->createCourse();
     $alt_course2 = $this->creator->createCourse();
     $lecture1 = $this->creator->createLecture($course1, $alt_course2);
     $lecture2 = $this->creator->createLecture($course2, $alt_course1);
     $lecture3 = $this->creator->createLecture($course1, $alt_course2);
     $lecture4 = $this->creator->createLecture($course1, $alt_course1);
     $lecture5 = $this->creator->createLecture($alt_course2);
     $lecture6 = $this->creator->createLecture($alt_course1);
     $lecture7 = $this->creator->createLecture($alt_course2);
     $lecture8 = $this->creator->createLecture($alt_course1);
     $this->conn->resetStats();
     $query = lmbARQuery::create('CourseForTest', array(), $this->conn);
     $query->where(lmbSQLCriteria::in('id', array($course1->getId(), $course2->getId())));
     $arr = $query->eagerAttach('lectures', array('join' => array('alt_course' => array('attach' => 'lectures'))))->fetch()->getArray();
     $this->assertEqual($this->conn->countQueries(), 3);
     //make sure we really eager fetching
     $this->db->delete('lecture_for_test');
     $this->db->delete('course_for_test');
     $this->conn->resetStats();
     $this->assertIsA($arr[0], 'CourseForTest');
     $this->assertEqual($arr[0]->getTitle(), $course1->getTitle());
     $lectures = $arr[0]->getLectures()->getArray();
     $this->assertEqual(count($lectures), 3);
     $this->assertEqual($lectures[0]->getId(), $lecture1->getId());
     $this->assertEqual($lectures[0]->getAltCourse()->getTitle(), $alt_course2->getTitle());
     $alt_course_lectures = $lectures[0]->getAltCourse()->getLectures();
     $this->assertEqual($alt_course_lectures[0]->getId(), $lecture5->getId());
     $this->assertEqual($alt_course_lectures[1]->getId(), $lecture7->getId());
     $this->assertEqual($lectures[1]->getId(), $lecture3->getId());
     $this->assertEqual($lectures[1]->getAltCourse()->getTitle(), $alt_course2->getTitle());
     $alt_course_lectures = $lectures[1]->getAltCourse()->getLectures();
     $this->assertEqual($alt_course_lectures[0]->getId(), $lecture5->getId());
     $this->assertEqual($alt_course_lectures[1]->getId(), $lecture7->getId());
     $this->assertEqual($lectures[2]->getId(), $lecture4->getId());
     $this->assertEqual($lectures[2]->getAltCourse()->getTitle(), $alt_course1->getTitle());
     $alt_course_lectures = $lectures[2]->getAltCourse()->getLectures();
     $this->assertEqual($alt_course_lectures[0]->getId(), $lecture6->getId());
     $this->assertEqual($alt_course_lectures[1]->getId(), $lecture8->getId());
     $this->assertIsA($arr[1], 'CourseForTest');
     $this->assertEqual($arr[1]->getTitle(), $course2->getTitle());
     $lectures = $arr[1]->getLectures()->getArray();
     $this->assertEqual(count($lectures), 1);
     $this->assertEqual($lectures[0]->getId(), $lecture2->getId());
     $this->assertEqual($lectures[0]->getAltCourse()->getTitle(), $alt_course1->getTitle());
     $alt_course_lectures = $lectures[0]->getAltCourse()->getLectures();
     $this->assertEqual($alt_course_lectures[0]->getId(), $lecture6->getId());
     $this->assertEqual($alt_course_lectures[1]->getId(), $lecture8->getId());
     $this->assertEqual($this->conn->countQueries(), 0);
 }
예제 #3
0
 function testInWithArrayProcessor()
 {
     $criteria = lmbSQLCriteria::in('id', array("10foo", "20bar"), 'intval');
     $this->assertEqual($criteria, new lmbSQLFieldCriteria('id', array(10, 20), lmbSQLFieldCriteria::IN));
 }