public function unsubscribe($subscriber_id, $categories = null, $permanent = true)
{
$trx = models\DbSubscription::getDb()->transaction !== null ? null : models\DbSubscription::getDb()->beginTransaction();
$subscription = models\DbSubscription::find()->withQueue($this->id)->withSubscriber($subscriber_id)->matchingCategory($categories)->one();
if ($subscription !== null) {
$canDelete = true;
if ($categories !== null) {
// it may be a case when some (but not all) categories are about to be unsubscribed
// if that happens and this subscription ends up with some other categories, only given categories
// should be deleted, not the whole subscription
$primaryKey = models\DbSubscriptionCategory::primaryKey();
models\DbSubscriptionCategory::deleteAll([reset($primaryKey) => array_map(function ($c) {
return $c->id;
}, $subscription->categories)]);
$canDelete = models\DbSubscriptionCategory::find()->where(['subscription_id' => $subscription->id])->count() <= 0;
}
if ($canDelete) {
if ($permanent) {
$subscription->delete();
} else {
$subscription->is_deleted = 1;
$subscription->update(true, ['is_deleted']);
}
}
}
if ($trx !== null) {
$trx->commit();
}
}