如何在laravel中跳过null并执行查询?

时间:2018-03-26 12:59:56

标签: php laravel

我想如果用户订阅了ID为8的计划,他应该收到他无法订阅的错误。如果不是他应该订阅。我试过下面的代码。但是当用户在表中没有记录时它无法工作。它给出错误“$sit=>null"我希望它应该跳过检查null或不为null。并且只关注计划ID 8。

public function newbonus()
{
    $sit = Deposit::where('user_id', Auth::user()->id)->first();

    if($sit->plan_id == 8){
      {
         session()->flash('message', 'You have Claimed Free Bonus Already.');
            Session::flash('type', 'warning');
            Session::flash('title', 'warning');
            return redirect()->back();

    }else{

        $data['general'] = GeneralSetting::first();
        $data['site_title'] = $data['general']->title;
        $data['basic'] = BasicSetting::first();
        $data['page_title'] = "Free Bonus";
        $data['payment'] = Payment::first();
        $data['plan'] = Plan::whereStatus(1)->get();
        return view('user.bonus-new',$data);
       }
}

2 个答案:

答案 0 :(得分:0)

您可以使用

if(optional($sit)->plan_id == 8)

有了这个,你有一个空的存款模型,所以出现了空的异常dosnt。

问候。

答案 1 :(得分:0)

所以,如果Id为8,或者它是否为null,您希望能够进入控制结构吗?发生的事情是,如果没有结果,整个变量都是null,并且您发现自己正在寻找不属于对象的属性。

有几种方法可以解决这个问题。首先,有趣的是,Eloquent Collection结果只是常规收藏的孩子。 $model->first()告诉Eloquent \ Builder只针对一个结果点击MySql。 $model->get()告诉我要获取所有结果并返回一个Collection。这意味着$model->first()$model->get()->first()在逻辑上是相同的,第二行可能会导致数据库性能下降。 可能一个高性能的打击。在您的情况下,虽然您在Id字段上查询可能只能返回一个结果。因此,通过点击集合first()而不是Eloquent \ Builder first(),您可以访问它对默认值的支持:

$sit = Deposit::where('user_id', Auth::user()->id)->get()->first(null, app(Deposit::class));

或者,相同的概念,不同的执行:

$sit = Deposit::where('user_id', Auth::user()->id)->first() ?: app(Deposit::class);

在这两种情况下,您都会使用空模型代替缺席结果,以便$sit->plan_id返回null而不是抛出错误$sit本身就是空的。

最后,您可以添加新的if条件:

if(is_null($sit) || $sit->plan_id == 8){

这里唯一的缺点是控件结构的内容也期望$sit成为对象。

我个人的偏好是选项#2。