【问题标题】:Deleting relationship in laravel without deleting the entry itself在laravel中删除关系而不删除条目本身
【发布时间】:2020-11-08 02:52:11
【问题描述】:

我有一个具有这种关系的用户模型:

public function users(){
        return $this->hasMany('App\User','parent_id');
}

它旨在让您关注的用户能够在您的供稿中看到他们的帖子。 当我关注某人时,我会这样做(在控制器内):

public function follow($myId, $hisId){
        
            $me = User::find($myId);
            $him = User::find($hisId);

            $me->users()->save($him);
            $me->save();
}

哪个有效。问题是当我试图取消关注时,我最终删除了用户本身,而我 只想删除我和他的关系。我正在这样做:

public function unfollow($myId,$hisId){
        $me = User::find($myId);
        $him = User::find($hisId);

        $me->users()->delete($him);
        $me->save();
}

非常感谢任何帮助。

【问题讨论】:

  • 执行followunfollow时你不是在User实例吗?删除做它的工作,删除。 Attach 和 detach 做的就是附加或分离。
  • 不,当我在某人的个人资料中点击关注时,我会进行 ajax 调用,端点 URL 会进入这些函数,我和他的 ID 在 URL 中传递。
  • 是的,没有.. 是的.. 你有一个经过身份验证的用户吗?还是每个人都可以通过使用随机 ID 调用请求来取消关注任何人?
  • 首先,要回答您的问题,请改用detach()
  • 是的,我有一个经过身份验证的用户。关注或取消关注按钮不会向客人显示。谢谢,我会尝试分离。

标签: database laravel eloquent eloquent-relationship


【解决方案1】:
  • 按照here 的解释,我们添加/删除了与associate()dissociate() 的属于(包括has-many)的关系。
  • 我们添加/删除了与attach()detach() 的属于对多(多对多)的关系,如here 所述

但我发现这种方法存在一些问题。

这显然是多对多的关系,我不明白一对多在这里应该如何工作。

// @pivot table user_follows
------------------------
| user_id | follows_id |
|-----------------------
| 1       | 2          |
| 2       | 1          |
|----------------------|

我假设 followunfollow 是某个控制器和类似路由的一部分。

Route::middleware(['auth'])->prefix('stalker')->group(function() {
    Route::post('follow/{id}/{follow_id}');
    Route::post('unfollow/{id}/{unfollow_id}');
});
class StalkerController extends Controller {
  
   public function follow($id, $follow_id) {
      // get user by $id
      // get user to follow by $follow_id
   }

   public function unfollow($id, $unfollow_id) {
      // get user by $id
      // get user to unfollow by $unfollow_id
   }
}

即使此控制器是中间件 auth 的一部分,每个人都可以随机调用您的路由(如果经过身份验证)并关注或取消关注他们不属于的用户。

如果我要通过 id 1 的用户进行身份验证,我可以调用 /stalker/unfollow/2/1(如果 id 为 2 的用户关注我,这将取消关注我)和/或任何其他 id t 我的用户 ID。

如果您的路线没有受到限制(例如使用['middleware' => 'throttle:3,10']),我可以循环并被所有人取消关注(或者相反,所有人都在关注我)。

// assume you don't have more users than 10.000.
$until = 10000;
// assuming this would be my user id.
$my_user_id = 1;
// I'll start with the next user.
$user_id = 2; 
// I just don't like to be followed.
while($user_id < $until) {
   // CURL is missing some tokens/session info, but pretend I added all that.
   CURL::call("yourdomain.com/stalker/unfollow/{$user_id}/{$my_user_id}");
   $user_id++;
}

所以只需获取调用路由的经过身份验证的用户:

public function follow($id) {
   $me = Auth::user();
   // one to many
   $me->users()->associate($id)
   // many to many
   $me->users()->attach($id);
}

而且你的路线只需要包含它希望关注或取消关注的用户的 id

Route::post('follow/{id}');
Route::post('unfollow/{id}');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-15
    • 2020-08-02
    • 1970-01-01
    • 2016-01-02
    • 2020-03-16
    • 2016-07-24
    • 2021-02-15
    • 1970-01-01
    相关资源
    最近更新 更多