我延長rainlab.user
插件,允許每個用戶通過一個簡單的中間表具有以下字段的朋友:OctoberCMS:如何保持雙向友誼關係?
user_id
friend_id
status
我已經延長了User
型號:
use RainLab\User\Models\User as FrontUser;
FrontUser::extend(function($model) {
$model->belongsToMany['friends']=[
'RainLab\User\Models\User',
'table' => 'meysam_social_friends',
'pivot' => ['status'],
'pivotModel' => 'Meysam\Social\Models\FriendsPivot',
'timestamps' => true,
'key' => 'user_id',
'otherKey' => 'friend_id'
];
$model->addDynamicMethod('isFriendWith', function (FrontUser $user) use ($model) {
$model->friends->contains($user->id);
});
$model->addDynamicMethod('addFriend', function (FrontUser $user) use ($model) {
$model->friends()->attach($user->id);
});
$model->addDynamicMethod('removeFriend', function (FrontUser $user) use ($model) {
$model->friends()->detach($user->id);
});
});
而且還將Rainlab.User Controller
擴展爲具有Friends
選項卡,其中列出用戶的所有朋友並且可以添加和刪除:
use RainLab\User\Controllers\Users as UsersController;
UsersController::extend(function($controller) {
if(!isset($controller->implement['Backend.Behaviors.RelationController'])) {
$controller->implement[] = 'Backend.Behaviors.RelationController';
}
$controller->relationConfig = '$/meysam/social/controllers/user/config_relations.yaml';
});
UsersController::extendFormFields(function($form, $model, $context) {
if(!$model instanceof FrontUser or $context != 'preview'){
// friends tab should not be displayed in update and create contexts
return;
}
$form->addTabFields([
'friends' => [
'label' => '',
'tab' => 'Friends',
'type' => 'partial',
'path' => '$/meysam/social/controllers/user/_friends.htm',
]
]);
});
現在我需要保持雙向的友誼關係。即無論何時將user_id
和friend_id
添加到friends
表中,我想自動將friend_id
和user_id
也添加到表中。要做到這一點,我在FriendsPivot
模型來實現afterSave
和beforeSave
:
class FriendsPivot extends Pivot
{
/*
* Validation
*/
public $rules = [
'status' => 'required'
];
public $belongsTo = [
'user' => ['RainLab\User\Models\User', 'key' => 'user_id'],
'friend' => ['RainLab\User\Models\User', 'key' => 'friend_id']
];
public function getStatusOptions()
{
return [
1 => 'Pending',
2 => 'Approved',
3 => 'Blocked',
];
}
public function afterSave()
{
Log::info('Saving pivot...');
if(!$this->friend->isFriendWith($this->user)) {
$this->friend->addFriend($this->user);
}
}
public function beforeDelete()
{
Log::info('Deleting pivot...');
if($this->friend->isFriendWith($this->user)) {
$this->friend->removeFriend($this->user);
}
}
}
的問題是,beforeDelete
不會被調用。 afterSave
被調用,但beforeDelete
永遠不會被調用,因此關係的反轉不會被刪除(user_id
- friend_id
被從數據庫中刪除,但friend_id
-user_id
不會被刪除)。爲什麼beforeDelete
不叫?有什麼我做錯了嗎?有沒有更好的方法來維持雙向的友誼關係?
我把一個破發點上這一行: https://github.com/octobercms/library/blob/master/src/Database/Pivot.php#L88 並意識到如果我刪除了一個朋友說,不會調用'October \ Rain \ Database \ Pivot'類的'delete'方法。 – Meysam