Yii2有很多自定义条件

时间:2015-04-06 10:56:21

标签: php activerecord yii2

我有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,我试图覆盖他的查询,但我不能。

2 个答案:

答案 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');