模型关系如何与刀片配合使用?

时间:2019-04-26 12:17:17

标签: laravel

我有一个模型“ applicants”,并且它与“ BloodGroup”模型具有“ belongsTo”关系。

这是ApplicantController中的索引函数:

    public function index()
    {
        $user = Auth::user();

        // $user = User::find(1);
        $applicants = $user->applicants->where('visible', 1);

        foreach ($applicants as $applicant) {
            $applicant->bloodGroup;
            $applicant->fiqa;
            $applicant->gender;
        }
        // return response()->json($applicants);
        return view('applicants.index', ['applicants' => $applicants]);
    }

这是我从API得到的响应:

{
    "1": {
        "id": 4,
        "blood_group_id": 1,
        "created_at": "2019-04-22 13:24:16",
        "updated_at": "2019-04-26 10:21:41",
        "blood_group": {
            "id": 1,
            "name": "A+",
            "visible": 1,
            "created_at": "2019-04-22 08:21:19",
            "updated_at": "2019-04-22 08:21:19"
        }
    }
}

但是当我将数据传递给视图时。它在以下几行中产生错误:

    <div class="row mx-4">
       <div class="col-06 pr-3">
          <p class="h5">Name:</p>
       </div>
       <div class="col-06">
          <p><?php echo e($applicant->blood_group->name); ?></p>
       </div>
    </div>

BloodGroup模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class BloodGroup extends Model
{
    public function applicants()
    {
        return $this->hasMany('App\Applicant');
    }
}

“申请人”表中的“血型”关系:

public function bloodGroup()
{
    return $this->belongsTo('App\BloodGroup');
}

能否请您指出我做错了什么以及应该怎么做。

3 个答案:

答案 0 :(得分:0)

我发现您的代码存在问题,因为您正在运行查询,但实际上并没有从中查询任何内容:

$applicants = $user->applicants()->where('visible', 1);

这将是必需的:

$applicants = $user->applicants()->where('visible', 1)->get();

因为无论如何您都在打电话给他们,也许请尝试通过以下方式加载关系:

$applicants = $user->applicants()->with('blood_group')->where('visible', 1)->get();

导致索引方法看起来像这样:

public function index()
{
    $user = Auth::user();

    $applicants = $user->applicants()->with('blood_group')->where('visible', 1)->get();

    return view('applicants.index', ['applicants' => $applicants]);
}

然后,您可以像这样访问刀片文件中的$applicants

@foreach($applicants as $applicant)
<div class="row mx-4">
   <div class="col-06 pr-3">
      <p class="h5">Name:</p>
   </div>
   <div class="col-06">
      <p>{{$applicant->blood_group->name}}</p>
   </div>
</div>
@endforeach

希望这会有所帮助。

答案 1 :(得分:-1)

它说的是什么错误?

return view('applicants.index', ['applicants' => $applicants]);

您正在将applicants传递到视图,但是在其中使用了$applicant。您是否在$applicants上循环?如果没有,那就是错误。

答案 2 :(得分:-1)

根据您的恋爱关系

public function bloodGroup()
{
    return $this->belongsTo('App\BloodGroup');
}

对于特定的申请人$applicant = Applicant::find(1);,您将能够获得与$applicant->bloodGroup类似的bloodGroup,现在您应该能够使用$applicant->bloodGroup->name来获取姓名。

您的代码应为

 public function index()
  {
     $user = Auth::user();
     $applicants = $user->applicants()->where('visible', 1)->get();
     return view('applicants.index', ['applicants' => $applicants]);
  }

您认为

@foreach ( $applicants as $applicant )
    {{ $applicant->bloodGroup->name }}
@endforeach

@swonder的关注

>>> App\User::find(1)->roles->where('role_id', '<', 1)
=> Illuminate\Database\Eloquent\Collection {#3178
     all: [
       App\models\Role {#3166
         id: 1,
         name: "super-admin",
         display_name: "Super Admin",
         description: "This will be one permission, that can not be assigned or
modified.",
         created_at: "2019-01-11 19:06:23",
         updated_at: "2019-01-11 19:06:23",
         pivot: Illuminate\Database\Eloquent\Relations\Pivot {#3141
           user_id: 1,
           role_id: 1,
         },
       },
     ],
   }

是@swonder是正确的,您应该使用

$user->applicants()->where('visible', 1)->get();

而不是$user->applicants->where('visible', 1),而不是all()get(),您可以尝试在其中收集,但是在查看以下观察结果后,您可能不希望这样做

>>> App\User::find(1)->roles->where('role_id', '=', 1)
=> Illuminate\Database\Eloquent\Collection {#3160
     all: [],
   }
>>> App\User::find(1)->roles->whereStrict('role_id', '=', 1)
=> Illuminate\Database\Eloquent\Collection {#3163
     all: [],
   }
>>> App\User::find(1)->roles->whereStrict('role_id', '<', 1)
=> Illuminate\Database\Eloquent\Collection {#3169
     all: [],
   }
>>> App\User::find(1)->roles->whereStrict('role_id', '>', 1)->all()
=> []
>>> App\User::find(1)->roles->whereStrict('role_id', '>', 1)->all()
>>> App\User::find(1)->roles->whereStrict('role_id', '=', 1)->all()
=> []
>>> App\User::find(1)->roles->whereStrict('role_id', '>', 1)->all()
=> []