如何在Yii2中使用ActiveQuery创建子查询

时间:2015-11-17 10:48:13

标签: php yii2

问题:我不知道如何在Yii2中的查询中使用子查询(显然在activequery对象中)

假设我有一个小型数据库:

country
id name
1  Netherlands
2  New Zealand
3  New Guinea

person
id countryid name
1  1         Mr. Hollander
2  2         Mr. New Zealander
3  2         Ms. New Zealander
4  3         Mr. New Guinean

假设我要从以new开头的国家/地区中选择所有人名。一个reqular查询将是:

SELECT name FROM person WHERE countryid IN (
    SELECT id FROM country WHERE name LIKE 'new%'
)

在Yii2中,第一部分很简单:

$query = Person::find();

我用Google搜索了我的问题,并遇到了this SO question。我的问题将通过以下代码解决:

$searchParam = 'new';
$query = Person::find();
$subquery = Country::find()->select('id')->andWhere(['like', 'name', $searchParam])->all();
$query->andWhere(['in', 'countryid', $subquery])->all();

但是这导致Yii2生成此错误:Object of class app\models\Country could not be converted to string,这显然是由where()方法引起的,该方法需要一个字符串或一个包含3个字符串条目的数组,并且ActiveQuery对象不是字符串。

那么我应该如何编写上述方法来创建子查询?

PS:我可能也在搞乱andWhere()的用法。即使是在文档中,我也不确定何时使用andWhere()以及何时使用where()

2 个答案:

答案 0 :(得分:3)

从子查询中删除->all()。因此,执行查询并返回结果。当你删除它时,结果将是一个ActiveQuery,因此它可以用作where部分中的子查询。

答案 1 :(得分:0)

它应该是这样的:

$searchParam = 'new';
$query = Person::find();
$subquery = Country::find()->select('id')->andWhere(['like', 'name', $searchParam])->createCommand()->getRawSql();
$query->select(['*','('.$subquery.') AS country']);
$query->andWhere(['in', 'countryid', $subquery])->all();

也在你的Person模型中添加:

public $country;

您只需将subquerye设置为带别名的select字段,并在模型中添加add var,以便您可以这样调用它:

$model->coutry

$model var是Person模型