/** * @depends testSearchByCustomFieldWithMultipleValues */ public function testSearchByMultipleValuesCustomField() { //Save a sample model. $model = new TestCustomFieldsModel(); $customFieldValue = new CustomFieldValue(); $customFieldValue->value = 'A'; $model->multipleIndustries->values->add($customFieldValue); $customFieldValue = new CustomFieldValue(); $customFieldValue->value = 'D'; $model->multipleSomethings->values->add($customFieldValue); $this->assertTrue($model->save()); //Save a second model with nothing. $model = new TestCustomFieldsModel(); $this->assertTrue($model->save()); $quote = DatabaseCompatibilityUtil::getQuote(); //Test where relatioon id is in a joining table. Many to Many relationship $_FAKEPOST['TestCustomFieldsModel'] = array(); $_FAKEPOST['TestCustomFieldsModel']['multipleIndustries']['values'] = array('A', 'B', 'C'); $metadataAdapter = new SearchDataProviderMetadataAdapter(new TestCustomFieldsModel(false), 1, $_FAKEPOST['TestCustomFieldsModel']); $searchAttributeData = $metadataAdapter->getAdaptedMetadata(); $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('TestCustomFieldsModel'); $where = RedBeanModelDataProvider::makeWhere('TestCustomFieldsModel', $searchAttributeData, $joinTablesAdapter); $compareWhere = "(1 = (select 1 from {$quote}customfieldvalue{$quote} customfieldvalue " . "where {$quote}customfieldvalue{$quote}.{$quote}multiplevaluescustomfield_id{$quote} = " . "{$quote}multiplevaluescustomfield{$quote}.id " . "and {$quote}customfieldvalue{$quote}.{$quote}value{$quote} IN('A','B','C') limit 1))"; // Not Coding Standard $this->assertEquals($compareWhere, $where); //Now test that the joinTablesAdapter has correct information. $this->assertEquals(0, $joinTablesAdapter->getFromTableJoinCount()); $this->assertEquals(1, $joinTablesAdapter->getLeftTableJoinCount()); $leftTables = $joinTablesAdapter->getLeftTablesAndAliases(); $this->assertEquals('multiplevaluescustomfield', $leftTables[0]['tableName']); //Now test that the subsetSQL query produced is correct. $subsetSql = TestCustomFieldsModel::makeSubsetOrCountSqlQuery('testcustomfieldsmodel', $joinTablesAdapter, 1, 5, $where, null); $compareSubsetSql = "select {$quote}testcustomfieldsmodel{$quote}.{$quote}id{$quote} id "; $compareSubsetSql .= "from {$quote}testcustomfieldsmodel{$quote} "; $compareSubsetSql .= "left join {$quote}multiplevaluescustomfield{$quote} on "; $compareSubsetSql .= "{$quote}multiplevaluescustomfield{$quote}.{$quote}id{$quote} = "; $compareSubsetSql .= "{$quote}testcustomfieldsmodel{$quote}.{$quote}multipleindustries_multiplevaluescustomfield_id{$quote} "; $compareSubsetSql .= "where " . $compareWhere . ' '; $compareSubsetSql .= 'limit 5 offset 1'; $this->assertEquals($compareSubsetSql, $subsetSql); //Make sure the sql runs properly. $dataProvider = new RedBeanModelDataProvider('TestCustomFieldsModel', null, false, $searchAttributeData); $data = $dataProvider->getData(); $this->assertEquals(1, count($data)); }