03
Май
2020

Laravel Eloquent. Одна модель, имеющая два внешних ключа на две другие модели

Имеются следующие 3 миграции с такими полями:

Кафедры:

class CreateDepartmentsTable extends Migration
{
    public function up()
    {
        Schema::create('departments', function (Blueprint $table) {
            $table->id();
            $table->string('name')->unique();
            $table->bigInteger('institute_id');
            $table->foreign('inst_id')
                ->references('id')
                ->on('institutes')
                ->onDelete('cascade');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('departments');
    }
}

Должности:

    class CreateDegreesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('degrees', function (Blueprint $table) {
            $table->id();
            $table->string('name')->unique();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('degrees');
    }
}

Преподаватели:

    class CreateLecturersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('lecturers', function (Blueprint $table) {
            $table->id();
            $table->string('last_name');
            $table->string('first_name');
            $table->string('middle_name');
            $table->string('phone_number');
            $table->string('email');
            $table->bigInteger('department_id');
            $table->foreign('department_id')
                ->references('id')
                ->on('departments')
                ->onDelete('cascade');
            $table->bigInteger('degree_id');
            $table->foreign('degree_id')
                ->references('id')
                ->on('degrees')
                ->onDelete('cascade');
            $table->unique(['last_name', 'first_name', 'middle_name']);
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('lecturers');
    }
}

Таблица с преподавателями имеет 2 внешних ключа, которые ссылаются на должности и кафедры, а именно degree_id и department_id. Т.е. на одной кафедре и одной должности может быть много преподавателей, а один преподаватель может принадлежать только одной кафедре И только одной должности. Не совсем понятен тот момент, как построить между моделями отношения: два belongsTo() в модели Lecturer или использовать полиморфное отношение? Если я, например, захочу показать в таблице ФИО преподавателей, их должности и кафедры (получить названия должностей и кафедр по внешним ключам), то как мне поступить в такой ситуации? Заранее спасибо.

P.S. Описание моделей в случае отношения один ко многим:

Кафедры:

class Department extends Model
{
    public function institutes(){
        return $this->belongsTo('Institute');
    }

    public function lecturers(){
        return $this->hasMany('Lecturer');
    }
}

Должности:

class Degree extends Model

    {
        public function lecturers(){
            return $this->hasMany('Lecturer');
        }
    }

Преподаватели:

class Lecturer extends Model
{
    public function departments(){
        return $this->belongsTo('Department');
    }

    public function degrees(){
        return $this->belongsTo('Degree');
    }
}

Источник: https://ru.stackoverflow.com/questions/1119754/laravel-eloquent-%D0%9E%D0%B4%D0%BD%D0%B0-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C-%D0%B8%D0%BC%D0%B5%D1%8E%D1%89%D0%B0%D1%8F-%D0%B4%D0%B2%D0%B0-%D0%B2%D0%BD%D0%B5%D1%88%D0%BD%D0%B8%D1%85-%D0%BA%D0%BB%D1%8E%D1%87%D0%B0-%D0%BD%D0%B0-%D0%B4%D0%B2%D0%B5-%D0%B4%D1%80%D1%83%D0%B3%D0%B8%D0%B5-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8

Тебе может это понравится...

Добавить комментарий