Как сделать hasMany и ownToMany в одной модели? - PullRequest
0 голосов
/ 26 мая 2020

У меня 2 модели: Employee и FieldReport. Мне нужно создать отношения на основе следующих условий:

Полевой отчет принадлежит сотруднику, чей символ является абсолютным (данные владельца должны отображаться и не могут быть изменены), где поле отчета также имеет , чтобы отметить сотрудников в этом поле отчета.

У самого сотрудника есть много полевых отчетов.

На данный момент я установил связь, примерно такую :

  1. У сотрудника много полевых отчетов.
  2. Сотрудник принадлежит ко многим полевым отчетам.
  3. Полевой отчет принадлежит сотруднику.
  4. Полевой отчет принадлежит для многих сотрудников.

Тогда у меня возникает проблема, когда PHP не позволяет использовать одно и то же имя метода (в модели Employee). Пример:

  • Имеет много имени метода fieldReports ()
  • Принадлежит многим также имеет имя метода fieldReports ()

Тогда как если я определяю пользовательское имя функции, я не могу получить значение для заполнения первого столбца сводной таблицы и сгенерировать следующую ошибку:

SQLSTATE [23000]: нарушение ограничения целостности: 19 Ошибка ограничения NOT NULL: field_report_participant. field_report_id (SQL: вставить в "field_report_participant" ("id", "members_id") values ​​(1, 2))

Есть ли какое-нибудь решение? Вот так выглядят мои скрипты:

Employee.php


/**
 * Each employee has many fieldReports.
 *
 * @return \Illuminate\Database\Eloquent\Relationship\HasMany
 */
public function fieldReports()
{
    return $this->hasMany(FieldReport::class);
}

/**
 * Each employee belongs to many fieldReports.
 *
 * @return \Illuminate\Database\Eloquent\Relationship\BelongsToMany
 */
public function fieldReports()
{
    return $this->belongsToMany(FieldReport::class);
}

FieldReportController.php

/**
 * Store a newly created resource in storage.
 *
 * @param  \App\Http\Requests\RequestFieldReport  $request
 * @return \Illuminate\Http\Response
 */
public function store(RequestFieldReport $request)
{
    $fieldReport = $this->data($request, $this->storeImages($request));

    $fieldReport->participants()->sync(
        $request->participants
    );

    return response()->json([
        'created' => true,
        'data' => $fieldReport,
    ], 201);
}

FieldReport.php

/**
 * Each field report belongs to a company.
 *
 * @return \Illuminate\Database\Eloquent\Relationship\BelongsTo
 */
public function company()
{
    return $this->belongsTo(Company::class);
}

/**
 * Each field report belongs to a employee.
 *
 * @return \Illuminate\Database\Eloquent\Relationship\BelongsTo
 */
public function employee()
{
    return $this->belongsTo(Employee::class);
}

/**
 * Each field report belongs to many participants.
 *
 * @return \Illuminate\Database\Eloquent\Relationship\BelongsToMany
 */
public function participants()
{
    return $this->belongsToMany(Employee::class, 'field_report_participant', 'participant_id', 'id');
}

create_field_reports_table.php

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateFieldReportsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('field_reports', function (Blueprint $table) {
            $table->id();
            $table->bigInteger('company_id');
            $table->bigInteger('employee_id');
            $table->string('title', 100);
            $table->text('chronology');
            $table->json('images')->nullable();
            $table->timestamp('closed_at')->nullable();
            $table->string('closed_by', 100)->nullable();
            $table->timestamp('opened_at')->nullable();
            $table->string('opened_by', 100)->nullable();
            $table->timestamps();
        });
    }

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

field_report_participant_table.php

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateFieldReportParticipantTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('field_report_participant', function (Blueprint $table) {
            $table->id();
            $table->bigInteger('field_report_id');
            $table->bigInteger('participant_id');
            $table->timestamps();
        });
    }

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

1 Ответ

1 голос
/ 26 мая 2020

Через час, когда я тянул волосы, пытался сделать сальто и задавал вопросы на разных форумах, наконец, я получил ответ. К сожалению, у него нет учетной записи на этом форуме, и он не может дать ответ на этот вопрос. место, в данном случае; id. Это решается следующим образом:

/**
 * Each field report belongs to many participants.
 *
 * @return \Illuminate\Database\Eloquent\Relationship\BelongsToMany
 */
public function participants()
{
    return $this->belongsToMany(Employee::class, 'field_report_participant', 'field_report_id', 'participant_id');
}

А затем, в классе Employee, я мог бы создать совершенно другой метод и связать его со сводной таблицей. Вот так:

/**
 * Each employee belongs to many assignedFieldReports.
 *
 * @return \Illuminate\Database\Eloquent\Relationship\BelongsToMany
 */
public function assignedFieldReports()
{
    return $this->belongsToMany(FieldReport::class, 'field_report_participant', 'participant_id', 'field_report_id');
}

Надеюсь, это может помочь кому-то, кто столкнется с этой же проблемой в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...