"andFilterWhere" 在 yii2 中与 "joinWith()" 一起工作但与 "with()" 一起工作不正常

"andFilterWhere" work proper with "joinWith()" but not with "with()" in yii2

我在yii2工作

employeecompany 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 ...