Вы не можете поменять методы joinWith()
и with()
, если вам нужно выполнить фильтрацию по столбцу из связанной таблицы. Это потому, что эти методы делают совершенно разные вещи.
Такие методы, как joinWith()
и join()
, фактически изменяют запрос, добавляя часть "JOIN" к запросу SQL. with
in joinWith
позволяет указать объединенную таблицу по определению отношения в модели. Стремительная загрузка в 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 ...