public function testViaOrder() { $firstProject = new Project(); $firstProject->name = 'Building'; $firstProject->save(); $secondProject = new Project(); $secondProject->name = 'Logistic'; $secondProject->save(); $firstWorker = new Worker(); $firstWorker->name = 'Mark'; $firstWorker->save(); $secondWorker = new Worker(); $secondWorker->name = 'Alex'; $secondWorker->save(); ProjectMembership::objects()->getOrCreate(['project' => $firstProject, 'worker' => $firstWorker, 'position' => 1, 'curator' => $secondWorker]); ProjectMembership::objects()->getOrCreate(['project' => $firstProject, 'worker' => $secondWorker, 'position' => 2, 'curator' => $firstWorker]); $this->assertEquals([['id' => '1', 'project_id' => '1', 'worker_id' => '1', 'position' => '1', 'curator_id' => '2'], ['id' => '2', 'project_id' => '1', 'worker_id' => '2', 'position' => '2', 'curator_id' => '1']], ProjectMembership::objects()->asArray()->all()); $this->assertEquals([['id' => '1', 'name' => 'Mark'], ['id' => '2', 'name' => 'Alex']], Worker::objects()->filter(['projects__id__in' => [$firstProject->id]])->order(['projects_through__position'])->asArray()->all()); $this->assertEquals([['id' => '2', 'name' => 'Alex'], ['id' => '1', 'name' => 'Mark']], Worker::objects()->filter(['projects__id__in' => [$firstProject->id]])->order(['-projects_through__position'])->asArray()->all()); $this->assertEquals([['id' => '1', 'name' => 'Mark'], ['id' => '2', 'name' => 'Alex']], Worker::objects()->order(['projects_through__position'])->asArray()->all()); $this->assertEquals([['id' => '2', 'name' => 'Alex'], ['id' => '1', 'name' => 'Mark']], Worker::objects()->order(['-projects_through__position'])->asArray()->all()); $this->assertEquals([['id' => '2', 'name' => 'Alex']], Worker::objects()->filter(['projects_through__curator' => $firstWorker])->asArray()->all()); $this->assertEquals([['id' => '1', 'name' => 'Mark']], Worker::objects()->filter(['projects_through__curator' => $secondWorker])->asArray()->all()); $this->assertEquals("SELECT `tests_worker_1`.* FROM `tests_worker` `tests_worker_1` LEFT OUTER JOIN `tests_project_membership` `tests_project_membership_2` ON `tests_worker_1`.`id` = `tests_project_membership_2`.`worker_id` LEFT OUTER JOIN `tests_project` `tests_project_3` ON `tests_project_membership_2`.`project_id` = `tests_project_3`.`id` WHERE (`tests_project_membership_2`.`curator_id`='2') GROUP BY `tests_worker_1`.`id`", Worker::objects()->filter(['projects_through__curator' => $secondWorker])->allSql()); $this->assertEquals("SELECT `tests_worker_1`.* FROM `tests_worker` `tests_worker_1` LEFT OUTER JOIN `tests_project_membership` `tests_project_membership_2` ON `tests_worker_1`.`id` = `tests_project_membership_2`.`worker_id` LEFT OUTER JOIN `tests_project` `tests_project_3` ON `tests_project_membership_2`.`project_id` = `tests_project_3`.`id` GROUP BY `tests_worker_1`.`id` ORDER BY `tests_project_membership_2`.`position`", Worker::objects()->order(['projects_through__position'])->asArray()->allSql()); $this->assertEquals("SELECT `tests_worker_1`.* FROM `tests_worker` `tests_worker_1` LEFT OUTER JOIN `tests_project_membership` `tests_project_membership_2` ON `tests_worker_1`.`id` = `tests_project_membership_2`.`worker_id` LEFT OUTER JOIN `tests_project` `tests_project_3` ON `tests_project_membership_2`.`project_id` = `tests_project_3`.`id` WHERE (`tests_project_3`.`id` IN ('1', '2')) GROUP BY `tests_worker_1`.`id` ORDER BY `tests_project_membership_2`.`position` DESC", Worker::objects()->filter(['projects__id__in' => [$firstProject->id, $secondProject->id]])->order(['-projects_through__position'])->allSql()); }
public function testSaveMixedRelationsShouldSucceed() { $project = new Project(); $project->name = "New project"; $project->company = Company::findOne(2); $users = User::findAll([1, 3]); $this->assertCount(0, $project->users, 'Project should have 0 users before save'); $project->users = $users; // Add users $this->assertEquals(2, count($project->users), 'Project should have 2 users after assignment'); $this->assertTrue($project->save(), 'Project could not be saved'); $this->assertCount(2, $project->users, 'Project should have 2 users after save'); $this->assertEquals(2, $project->company_id, 'Company ID is not the one expected'); }