【问题标题】:laravel - using if statement correctlylaravel - 正确使用 if 语句
【发布时间】:2018-12-17 20:11:19
【问题描述】:

我的代码运行良好,但我需要它简短。我正在使用 if 语句,所以选择我将使用 user_id 还是 Guest_ip。

但是我得到一个很长的代码,有什么帮助吗?

if (Auth::guest()) {

        $Task = Enrollee::with('path.ProgrammingField')->with(['path.pathtags' => function ($q) use ($TagArray)
        {
            $q->with(['Tasks' => function ($q) use ($TagArray)
              {$q->has('tasktags', '=', 2)->orderBy('id', 'ASC') ->whereDoesntHave('tasktags',
                function ($query) use ($TagArray) {
                            $query->whereNotIn('name', $TagArray);
                        }
                    )
               ->with('tasktags');
           }]
        )->orderBy('id', 'ASC');
       }])
        ->where( 'user_id' , '=' , Auth::user()->id )
        ->where('Path_id', $Path->id) ->get();

        $Tasks = $Task[0]->path;
        $Subs = Enrollee::where( 'user_id' , '=' , Auth::user()->id )->where('Path_id', $Path->id)->get();
       $AllSubs = [];
        foreach($Subs as $sub){
            $AllSubs[] = $sub->task_id;
        }
        $AllSubTasks = implode(" ",$AllSubs);
        $SubTasks = explode(",", ($AllSubTasks));
}

       else {

$Task = Enrollee::
with('path.ProgrammingField')

->with(['path.pathtags' => function ($q) use ($TagArray)
{
    $q->with(['Tasks' => function ($q) use ($TagArray)
      {$q->has('tasktags', '=', 2)->orderBy('id', 'ASC')
    ->whereDoesntHave('tasktags',
                function ($query) use ($TagArray) {
                    $query->whereNotIn('name', $TagArray);
                }
            )
       ->with('tasktags');
   }]
)->orderBy('id', 'ASC');
    }])
->where( 'guest_ip' , '=' , '127.0.0.1' )
->where('Path_id', $Path->id) ->get();

$Tasks = $Task[0]->path;
$Subs = Enrollee::where( 'guest_ip' , '=' ,'127.0.0.1') ->where('Path_id', $Path->id)->get();
   $AllSubs = [];
       foreach($Subs as $sub){
            $AllSubs[] = $sub->task_id;
      }
$AllSubTasks = implode(" ",$AllSubs);
$SubTasks = explode(",", ($AllSubTasks));
}

我可以用吗

if (Auth::guest()) {

->where( 'guest_ip' , '=' , '127.0.0.1' )
}

如果我使用guest_ip或用户id使用if语句,我需要成为一个代码并更改

【问题讨论】:

  • 这不会帮助您立即解决问题,但正确缩进您的代码会帮助您更轻松地推理它。
  • 谢谢,但我觉得我的代码太长了

标签: php laravel-5 eloquent


【解决方案1】:

希望这会对你有所帮助。

$ObjTask = Enrollee::with('path.ProgrammingField')
        ->with(['path.pathtags' => function ($q) use ($TagArray) {
                $q->with(['Tasks' => function ($q) use ($TagArray) {
                        $q->has('tasktags', '=', 2)->orderBy('id', 'ASC')
                        ->whereDoesntHave('tasktags', function ($query) use ($TagArray) {
                                    $query->whereNotIn('name', $TagArray);
                                }
                        )
                        ->with('tasktags');
                    }]
                )->orderBy('id', 'ASC');
            }])
        ->where('Path_id', $Path->id);
$Subs = null;
if (Auth::guest()) {
    $Task  = $ObjTask->where('user_id', '=', Auth::user()->id)->get();    
    $Subs  = Enrollee::where('user_id', '=', Auth::user()->id)->where('Path_id', $Path->id)->get();
}
else {
    $Task  = $ObjTask->where('guest_ip', '=', '127.0.0.1')->get();
    $Subs  = Enrollee::where('guest_ip', '=', '127.0.0.1')->where('Path_id', $Path->id)->get();
}
$Tasks = $Task[0]->path ?? null;
$AllSubs     = [];
$AllSubTasks = $SubTasks    = null;
if (!empty($Subs)) {
    foreach ($Subs as $sub) {
        $AllSubs[] = $sub->task_id;
    }
    $AllSubTasks = implode(" ", $AllSubs);
    $SubTasks    = explode(",", ($AllSubTasks));
}

【讨论】:

    【解决方案2】:

    正确缩进代码后(如正确建议的@castis),您可以开始将语句中的位提取到方法中。这就是重构。

    来自wikipedia:

    代码重构是重构现有计算机代码的过程——改变因子——而不改变其外部行为。

    它看起来像这样:

    if(true) {
        doWhateverNeedsToBeDone();
    } else {
        doTheOtherThing();
    }
    

    然后复制所有代码并粘贴到这些新方法的主体中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-16
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多