Yii2使用关系删除查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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))

任何帮助,将不胜感激。

答案

你可以这样做:

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

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

在这种情况下,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();

以上是关于Yii2使用关系删除查询的主要内容,如果未能解决你的问题,请参考以下文章

Yii2 中的 $with 和 $joinWith 有啥区别以及何时使用它们?

Yii2片段缓存详解

Yii2 软删除

如何使用yii2的缓存依赖特性

Yii2-设置和获取删除Cookies空值分析(有代码)

如何在Yii2中使用查询