2016-11-09 2 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

Спасибо, но я хочу создать этот запрос с помощью Active Record, как и в выбранной версии. –

0

Вы можете сделать следующее:

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

Feed::deleteAll([ 
    'id' => [2, 3], 
    'website_id' => $query 
]); 
Смежные вопросы