"andFilterWhere" 在 yii2 中与 "joinWith()" 一起工作但与 "with()" 一起工作不正常
"andFilterWhere" work proper with "joinWith()" but not with "with()" in yii2
我在yii2工作
有 employee
和 company
table 名员工包含 company_id
。
我有一个过滤器搜索 运行 正确 如果我使用 joinWith()
$query = Employee::find();
$query->joinWith(['company']);
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => false,
'sort' => false,
]);
if (!($this->load($params) && $this->validate())) {
return $dataProvider;
}
//and below is the filterwhere
$query->andFilterWhere(['like', 'company.name', $this->company_id]);
但是当我使用 with()
进行查询时出现了问题
$query = Employee::find()->with(['company']);
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => false,
'sort' => false,
]);
if (!($this->load($params) && $this->validate())) {
return $dataProvider;
}
//when query contain with() then this filter is not working.
$query->andFilterWhere(['like', 'company.name', $this->company_id]);
当我使用 with()
时出现错误
Database Exception – yii\db\Exception
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'company.name' in 'where clause'
The SQL being executed was: SELECT COUNT(*) FROM `employee` WHERE `company`.`name` LIKE '%1%'
员工与公司的关系如下:
public function getCompany(){
return $this->hasOne(Company::className(), ['id'=> 'company_id']);
}
任何人都可以帮助我或指导我如何在查询中使用 with()
正确过滤数据?
谢谢。
当您需要按相关 table 中的列进行过滤时,您不能交换 joinWith()
和 with()
方法。那是因为这些方法做的事情完全不同。
像joinWith()
和join()
这样的方法实际上修改了查询以将"JOIN"部分添加到SQL查询中。 joinWith
中的 with
允许您通过模型中的关系定义指定连接的 table。 joinWith 中的预加载只是副作用,您甚至可以通过将 false
作为第二个参数传递来关闭它。
当你这样做时:
Employee::find()->joinWith(['company'])->all();
运行 的查询如下所示:
SELECT * FROM employee LEFT JOIN company ON (...)
另一方面,方法 with()
不会修改查询本身。它只会强制预先加载相关模型。实际上,第二个查询用于预加载相关记录。
当你这样做时:
Employee::find()->with(['company'])->all();
它实际上 运行 查询如下:
SELECT * FROM employee;
SELECT * FROM company WHERE id IN (...company ids selected in first query...);
所以当你尝试做的时候:
$query = Employee::find()
->with(['company'])
->andFilterWhere(['like', 'company.name', $this->company_id])
->all();
生成的查询是
SELECT * FROM employee WHERE company.name LIKE ...
我在yii2工作
有 employee
和 company
table 名员工包含 company_id
。
我有一个过滤器搜索 运行 正确 如果我使用 joinWith()
$query = Employee::find();
$query->joinWith(['company']);
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => false,
'sort' => false,
]);
if (!($this->load($params) && $this->validate())) {
return $dataProvider;
}
//and below is the filterwhere
$query->andFilterWhere(['like', 'company.name', $this->company_id]);
但是当我使用 with()
进行查询时出现了问题
$query = Employee::find()->with(['company']);
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => false,
'sort' => false,
]);
if (!($this->load($params) && $this->validate())) {
return $dataProvider;
}
//when query contain with() then this filter is not working.
$query->andFilterWhere(['like', 'company.name', $this->company_id]);
当我使用 with()
Database Exception – yii\db\Exception
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'company.name' in 'where clause'
The SQL being executed was: SELECT COUNT(*) FROM `employee` WHERE `company`.`name` LIKE '%1%'
员工与公司的关系如下:
public function getCompany(){
return $this->hasOne(Company::className(), ['id'=> 'company_id']);
}
任何人都可以帮助我或指导我如何在查询中使用 with()
正确过滤数据?
谢谢。
当您需要按相关 table 中的列进行过滤时,您不能交换 joinWith()
和 with()
方法。那是因为这些方法做的事情完全不同。
像joinWith()
和join()
这样的方法实际上修改了查询以将"JOIN"部分添加到SQL查询中。 joinWith
中的 with
允许您通过模型中的关系定义指定连接的 table。 joinWith 中的预加载只是副作用,您甚至可以通过将 false
作为第二个参数传递来关闭它。
当你这样做时:
Employee::find()->joinWith(['company'])->all();
运行 的查询如下所示:
SELECT * FROM employee LEFT JOIN company ON (...)
另一方面,方法 with()
不会修改查询本身。它只会强制预先加载相关模型。实际上,第二个查询用于预加载相关记录。
当你这样做时:
Employee::find()->with(['company'])->all();
它实际上 运行 查询如下:
SELECT * FROM employee;
SELECT * FROM company WHERE id IN (...company ids selected in first query...);
所以当你尝试做的时候:
$query = Employee::find()
->with(['company'])
->andFilterWhere(['like', 'company.name', $this->company_id])
->all();
生成的查询是
SELECT * FROM employee WHERE company.name LIKE ...