问题
Question: Let's Say i have two tables,
Table1 Table2
-authorId -username
As of now my sql query on search model looks like this,
->andFilterWhere(['"Table1"."authorId"' => $this->authorName]);
It only helps to search and filter using the authorID.
Expected Result I would like to search based on the authorname instead of authorId.
I faced similar difficulty in reflecting data in view but i was able to fix it with following getter function in base model.
public function getAuthorName() {
return $this->author->username;
}
Thanks in Advance,
回答1:
First, add a custom attribute to your search model
public $username
define a relation to your author
table inside the model
public function getAuthor() {
return $this->hasOne(Author::className(),['id'=>'authorId']);
}
in your gridview
replace the authorId
column with
`author.username`
and use the following to compare
$query->andFilterWhere(['like', '{{%Table2}}.username',$this->username]);
and yes make sure you join you searchmodel query with the author
table in the start of search function
->joinWith('author')
回答2:
Assuming authorId
is a FK to table2
, and you have previoulsy joined table2
to table1
, you can do the following:
->andFilterWhere(['table2.username' => $this->authorName]);
来源:https://stackoverflow.com/questions/48418082/search-in-related-model-using-gridview-filter-field