Laravel,将两个口才的查询简化为一个

时间:2018-11-29 22:20:51

标签: php laravel

我可以将这两个查询简化为一个吗,我可以使用我的版本,但是我认为可以更简单地完成

public function removeFriend($userId)
{
   $user = User::findOrFail($userId);
   $user_id = $user->id;

   $me = \Auth::user();
   $me_id = $me->id;


   //DB::table('friends')->where(['friend_id' => $me_id, 'user_id' => $user_id, 'accepted' => '1'])->delete();
   //DB::table('friends')->where(['friend_id' => $user_id, 'user_id' => $me_id, 'accepted' => '1'])->delete();

   //$first = DB::table('friends')->where(['friend_id' => $me_id, 'user_id' => $user_id, 'accepted' => '1']);
   //DB::table('friends')->where(['friend_id' => $user_id, 'user_id' => $me_id, 'accepted' => '1'])->union($first)->delete();



   return redirect()->back();
} 

注释行是两个查询,下面是我研究过的一个查询,但认为有点类似,基本上我尝试使用orWhere()加入第二个查询,但是它也得到了其他所有朋友,如果我加入他们只有where()没有任何东西,所以很破灭

2 个答案:

答案 0 :(得分:1)

根据您的问题,我假设您要实现“取消好友”功能。

让我们更新您的代码。

public function removeFriend($userId)
{
    // This is not necessary. You are making one more query which is doing nothing basically. You are getting $userID which is same as $user->id
    //$user = User::findOrFail($userId);
    //$user_id = $user->id;

    //DB::table('friends')->where(['friend_id' => $me_id, 'user_id' => $user_id, 'accepted' => '1'])->delete();
    //DB::table('friends')->where(['friend_id' => $user_id, 'user_id' => $me_id, 'accepted' => '1'])->delete();

    //$first = DB::table('friends')->where(['friend_id' => $me_id, 'user_id' => $user_id, 'accepted' => '1']);
    //DB::table('friends')->where(['friend_id' => $user_id, 'user_id' => $me_id, 'accepted' => '1'])->union($first)->delete();

    // Better Approach
    try {
        $result DB::table('friends')
            ->where(function($query) use($userID) {
                $query->where('friend_id', $userID)->where('user_id', Auth::id());    
            })->orWhere(function($query) use($userID) {
                $query->where('user_id', $userID)->where('friend_id', Auth::id());
            })
            ->delete();

        //Do whatever you want woth result
    }
    catch(/Exception $e) {
        // Exception Handling;
    }          

    return redirect()->back();
} 

注意:未经测试。

答案 1 :(得分:1)

以这种方式构建查询意味着您的ID确实不同。在这种情况下,您可以将orWhere用作高级查询来添加两个值,并获得2行可以循环和删除。但是由于它们不同,您将永远不会有2行合并成1行,并且能够像这样使用delete。当您开始加入事物时,它不会作为对象出现:

Friend::where('accepted', '=' 1)->where( function($query) use($me_id, $user_id) {
                                      $query->where('friend_id', '=', $user_id)
                                            ->orWhere('friend_id', '=', $me_id);
                                 })->get();