2016-11-09 70 views
0

我已经定义在Yii2的关系中,每一个网站可以有多个饲料的关系:Yii2删除查询使用

public function getFeeds() { 
    return $this->hasMany(Feed::className(), ['website_id' => 'id']); 
} 

现在考虑下面的查询:

$ids = [2, 3]; 
$feeds = Website::find()->where(['user_id' => 1])->with(['feeds' => function($query) use ($ids) { 
    $query->where(['id' => $ids); 
}])->all(); 

相应的原始SQL查询:

SELECT * FROM `website` WHERE `user_id`= 1 // returns 4, 5, 6 
SELECT * FROM `feed` WHERE (`id` IN (2, 3)) AND (`website_id` IN (4, 5, 6)) 

我的问题是,我可以使用Active Record删除此查询的版本吗?这样的事情:

SELECT * FROM `website` WHERE `user_id`= 1 
DELETE FROM `feed` WHERE (`id` IN (2, 3)) AND (`website_id` IN (4, 5, 6)) 

任何帮助,将不胜感激。

回答

0

在这种情况下可能会更好CreateCommand

为做到这一点,你应该使用连接如BILD原始查询:

select * 
from `feed` 
join `website` on `website`.id = `feed`.`website_id` 
WHERE website`.`user_id`= 1 
AND `feed`.id IN (2, 3) 

或删除

delete 
from `feed` 
join `website` on `website`.id = `feed`.`website_id` 
WHERE website`.`user_id`= 1 
AND `feed`.id IN (2, 3) 

然后Yii2

$sql = "delete 
     from `feed` 
     join `website` on `website`.id = `feed`.`website_id` 
     WHERE website`.`user_id`= 1 
     AND `feed`.id IN (2, 3);" 

Yii::$app->db->createCommand($sql)->execute(); 
+0

谢谢,但我想创建这个查询使用活动记录,就像选择版本。 –

0

你可以这样做:

$query = Website::find() 
    ->select('id') 
    ->where(['user_id' => 1]); 

Feed::deleteAll([ 
    'id' => [2, 3], 
    'website_id' => $query 
]);