我有sql condidtion SELECT * FROM (SELECT * FROM Prices WHERE aliasId = :aliasId order by id desc) p1 group by p1.currency
,我试图在hasMany语句中使用它。
$q = $this->hasMany(Prices::className(), ['aliasId' => 'id']);
$db = \Yii::$app->db;
$query = $db
->createCommand('SELECT * FROM (SELECT * FROM Prices WHERE aliasId = :aliasId order by id desc) p1 group by p1.currency')
->bindValue(':aliasId', $this->id);
$query->prepare(true);
$q->sql = $query->getRawSql();
return $q;
但是当hasMany调用时,$this->id
为空。有没有办法在那里绑定自定义查询和链接数组?
更新。
我知道$this->id
的原因是空的,因为我在我的Controller中使用Prices::find()>with('prices')
,所以Yii为所有价格列表创建查询。 hasMany
只是在addWhere('in', $key, $value)
参数的空查询中添加了$link
,我试图覆盖他的查询,但我不能。
答案 0 :(得分:0)
$this->id
实例, PriceAlias
为空,并且只有在模型保存在db中后才会填充 - 您最有可能因为getPrices()
被调用而获得空值在模型保存在db。
您可以在构建自定义命令之前测试$this->id != null
或$this->isNewRecord == false
,否则返回null
,空数组或根据需要。
更新1:不确定我完全理解您的更新,
Prices::find()>with('prices')
会创建WHERE ... IN (...)
查询,但是
hasMany
未添加addWhere
规则,它会为ActiveRecord类创建关系。在你的情况下:
$this->hasMany(Prices::className(), ['aliasId' => 'id'])
// generates: SELECT * FROM `prices` WHERE `aliasId` = :id
只有在您专门为对象调用getPrices()
时才会执行查询。
所以你的问题是?在 $q->sql = $query->getRawSql();
语句后,$q->sql
不是SELECT * FROM (SELECT * FROM Prices WHERE aliasId = :aliasId order by id desc) p1 group by p1.currency
?
更新2:我现在明白了。我想不出在自定义sql的关系上使用Prices::find()->with()
的任何方法,至少不是你想要使用的方法。
如果您需要保留自定义查询,我只能建议您在控制器中找到find()->with()
的替代方法。
答案 1 :(得分:0)
来自官方文件:
$subQuery = (new Query())->select('id')->from('user')->where('status=1');
// SELECT * FROM (SELECT `id` FROM `user` WHERE status=1) u
$query->from(['u' => $subQuery]);
在你的情况下它应该是这样的:
$subQuery = (new Query())->select('*')->from('Prices')->where('aliasId = :aliasId', ['aliasId'=>$aliasId])->orderBy('id');
$query->from(['p1' => $subQuery])->groupBy('p1.currency');