yii2 中的子查询
Subquery in yii2
我有2张桌子
项目(id,名称)
账户(id,project_id,account_name)
我想找到所有 account_name 这样的项目
SELECT Project.*,(SELECT account_name FROM accounts WHERE projectid = Project.id) FROM projects as Project
请告诉我这在 yii2 中如何实现。
我可以在 cakephp 中轻松完成,我们可以在其中使用 virtualFields.is yii2 中有任何功能,如 cakephp ?
我试过了
$rows = (new \yii\db\Query())
->select(['*','(SELECT account_name FROM accounts WHERE id = projects.account_id) as account_name'])
->from('projects')
->where(['id' => $id])
->all();
这对我有用。
实际上,您应该能够将其作为附加列写入 select()
调用(带括号的列名被自动视为数据库表达式)
Project::find()
->select([
'Project.*',
'(SELECT account_name FROM accounts WHERE projectid = Project.id) AS account_name'
])
->asArray()->all();
如果您希望在 ActiveRecord class 中显示列而不是数组,请声明一个额外的 public 属性 来接收字段:
class Project extends ActiveRecord {
// ...
public $account_name;
// ...
}
见http://www.yiiframework.com/doc-2.0/yii-db-query.html#select()-detail
我认为这更具可读性。
也没有原始查询。
$rows = (new \yii\db\Query())
->select([
'p.*',
'a.account_name'
])
->from('projects p')
->innerJoin('accounts a', 'a.id = p.account_id')
->all();
我有2张桌子
项目(id,名称)
账户(id,project_id,account_name)
我想找到所有 account_name 这样的项目
SELECT Project.*,(SELECT account_name FROM accounts WHERE projectid = Project.id) FROM projects as Project
请告诉我这在 yii2 中如何实现。
我可以在 cakephp 中轻松完成,我们可以在其中使用 virtualFields.is yii2 中有任何功能,如 cakephp ?
我试过了
$rows = (new \yii\db\Query())
->select(['*','(SELECT account_name FROM accounts WHERE id = projects.account_id) as account_name'])
->from('projects')
->where(['id' => $id])
->all();
这对我有用。
实际上,您应该能够将其作为附加列写入 select()
调用(带括号的列名被自动视为数据库表达式)
Project::find()
->select([
'Project.*',
'(SELECT account_name FROM accounts WHERE projectid = Project.id) AS account_name'
])
->asArray()->all();
如果您希望在 ActiveRecord class 中显示列而不是数组,请声明一个额外的 public 属性 来接收字段:
class Project extends ActiveRecord {
// ...
public $account_name;
// ...
}
见http://www.yiiframework.com/doc-2.0/yii-db-query.html#select()-detail
我认为这更具可读性。 也没有原始查询。
$rows = (new \yii\db\Query())
->select([
'p.*',
'a.account_name'
])
->from('projects p')
->innerJoin('accounts a', 'a.id = p.account_id')
->all();