问题:我不知道如何在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()
。
答案 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模型