Laravel 5.6 - 关系一对多(反转) - 不起作用

时间:2018-03-23 13:56:08

标签: laravel

我正在学习关系。 我学生的错误在哪里 - 性别关系?

学生表:

        Schema::create('students', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->integer('gender_id')
                ->unsigned()
                ->references('id')
                ->on('genders')
                ->onDelete('cascade');
        $table->timestamps();
    });

性别表:

        Schema::create('genders', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->timestamps();
    });

StudentsController

use App\Student;
use App\Gender;

class StudentsController extends Controller
{
/**
 * Display a listing of the resource.
 *
 * @return \Illuminate\Http\Response
 */
public function index()
{
    $students = Student::all();
    return view('index', compact('students'));
}

Index.blade

<pre>{{var_dump($students[0]->gender_id->name)}}</pre>

错误消息$学生中没有任何对象。

Trying to get property of non-object

性别模型:

    public function students() {
    return $this->hasMany('App\Student');
}

学生模特:

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

2 个答案:

答案 0 :(得分:0)

您需要使用关系方法/属性访问关系,而不是相关字段。因此,您需要使用gender,而不是gender_id

<pre>{{var_dump($students[0]->gender->name)}}</pre>

请注意,如果学生没有相关性别,您将收到相同的错误。

答案 1 :(得分:0)

为什么要为性别创建新表?每个学生只有一个性别(女性/男性),因此无需将其保存在另一个表格中,只需在学生表格中设置性别列,如果您需要所有男性学生,请运行此项:

男学生:

$males = Student::where('gender', 'male')->get();
女学生:

$females = Student::where('gender', 'female')->get();