2015-04-06 70 views
4

我有sql condidtion SELECT * FROM (SELECT * FROM Prices WHERE aliasId = :aliasId order by id desc) p1 group by p1.currency,我正在嘗試在hasMany語句中使用它。Yii2 has has many custom condition

$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爲空。有沒有什麼辦法綁定自定義查詢和鏈接數組呢?

UPDATE。 我知道$this->id的原因是空的,因爲我在我的Controller中使用Prices::find()>with('prices'),所以Yii爲所有價格列表創建查詢。 hasMany只是在$link參數的空查詢中添加addWhere('in', $key, $value),我試圖覆蓋他的查詢,但我不能。

+0

你可以請提供更多的代碼,其中定義代碼? – AndreiDMS 2015-04-06 12:28:47

+0

所有此代碼均來自PricesAlias ActiveRecordClass中的getPrices函數(價格類爲空的活動記錄)。不久,我在價格表中有很多行,並帶有aliasId屬性(哪些鏈接PricesAlias和Prices表)。在getPrices方法中,我需要返回帶有唯一貨幣字段的最後價格記錄。 – user1958350 2015-04-06 20:22:00

+0

對不起,我不明白你想達到什麼樣的效果,以及你實際遇到了哪些問題。你能更清楚一點嗎?請修改您的帖子。爲什麼你有這個嵌套查詢? AFAIK你不需要那個。你創建一個hasMany查詢$ q,你以後用$ q-> sql進行更改?這一切都有意義嗎?對不起,瑪貝是我的錯... – robsch 2015-04-13 19:18:53

回答

0

$this->id是空的新 PriceAlias實例,它填補了模型保存在數據庫後才 - 您得到最有可能的,因爲該模型被保存在數據庫之前 getPrices()被稱爲空值。

您可以測試是否$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:我現在明白了。我想不出任何使用Prices::find()->with()與自定義sql的關係,至少不是你想要使用的。

如果您需要保留自定義查詢,我只能建議在您的控制器中找到替代方案find()->with()

+0

我更新了我的問題,對不完整的信息抱歉。 – user1958350 2015-04-07 07:48:30

+0

更新我的答案,也許你可以提供更多的代碼,可以幫助... – AndreiDMS 2015-04-07 09:23:10

+0

Yii中的ActiveRelationTrait可以爲記錄列表關係生成一個查詢,在本例中爲':: find() - >(例如「價格」)。當它在'with'模式下工作時,我需要在我的查詢中添加aliasId列表,該列表由YII在ActiveRelationTrait :: buildBuckets中創建。 – user1958350 2015-04-07 13:09:39

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'); 
+0

我不能在我的查詢中使用$ aliasId,因爲ActiveRelation只在整個列表中調用getPrices一次,當我嘗試使用 - > ActiveRecord方法連接表時。 – user1958350 2015-04-11 19:07:02